使用cURL的CURLOPT_COOKIEFILE选项处理多个请求

时间:2011-01-26 14:58:30

标签: php cookies curl

我正在使用CURLOPT_COOKIEJAR将Cookie存储到文件中,并使用CURLOPT_COOKIEFILE从文件中检索它们。

我很奇怪当多个用户同时访问脚本时会发生什么 - 它不会搞乱cookie文件的内容吗?另外,如何管理cookie文件,以便可以同时拥有多个用户?

3 个答案:

答案 0 :(得分:3)

您需要为每次执行脚本指定一个不同的文件,否则您将会覆盖文件被覆盖的问题,等等。

您可能希望查看tempnam(下面的示例)作为生成唯一文件的方法,或者只是使用uniqid等,并自行创建文件。

<?php
    session_start();
    $cookieFilePath = $_SESSION['cookiefilepath']
                         ? $_SESSION['cookiefilepath']
                         : tempnam(sys_get_temp_dir(), session_id().'_cookie_');
    $_SESSION['cookiefilepath'] = $cookieFilePath;
    ...
    curl_setopt($curlSession, CURLOPT_COOKIEFILE, $cookieFilePath);
    ...
?>

也就是说,您需要确保在不再需要这些文件后将其删除。 (如果这不在脚本的生命周期内,您可能希望通过使用filemtime或类似内容的cron定期执行整理脚本。)

顺便提一句,您只需提供要使用的文件的完整路径 - 它不必与脚本所在的目录相同,尽管在现有的Can someone explain CURL cookie handling (PHP)?问题。

答案 1 :(得分:3)

CURLOPT_COOKIEJARCURLOPT_COOKIEFILE只是用于处理文件中的Cookie的实用程序,例如Web浏览器。 并且不建议用于您的情况。

但您可以直接使用http标头来设置和检索Cookie。

为你设置cookies

<?php
curl_setopt($ch, CURLOPT_COOKIE, 'user=xxxxxxxx-xxxxxxxx');
?>

要检索Cookie,只需标识以Set-Cookie:

开头的标头

您可以查看此文档,了解Cookie标头的工作原理http://curl.haxx.se/rfc/cookie_spec.html

用法示例,快速而又脏,但绝对 不标准

使用此标题

<?php
$header_blob = '
Set-Cookie: PART_NUMBER=ROCKET_LAUNCHER_0001; path=/
Set-Cookie: PART_NUMBER=RIDING_ROCKET_0023; path=/ammo
';

提取Cookie标头

$cookies = array();
if (preg_match_all('/Set-Cookie:\s*(?P<cookies>.+?);/i', $header_blob, $matches)) {
    foreach ($matches['cookies'] as $cookie) {
        $cookies[] = $cookie;
    }
    $cookies = array_unique($cookies);
}
var_dump($cookies);

重新发送Cookie

$cookie_blob = implode('; ', $cookies);
var_dump($cookie_blob);

答案 2 :(得分:1)

多个请求将覆盖同一个文件(但由于文件锁定,可能还会减慢所有其他请求执行速度)。

您可以将session_id()合并到Cookie文件名中,这样每个客户端会话都会有一个Cookie文件。我还建议将文件存储为sys_get_temp_dir()

类似的东西:

$cookieFile = sys_get_temp_dir().PATH_SEPARATOR.session_id().'-cookies.txt';

应该可以正常工作。