【问题标题】:Handling multiple requests whilst using cURL's CURLOPT_COOKIEFILE option使用 cURL 的 CURLOPT_COOKIEFILE 选项处理多个请求
【发布时间】:2011-06-15 21:55:26
【问题描述】:

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

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

【问题讨论】:

  • 如果副本中的答案是正确的,那比乱七八糟还要糟糕:)
  • @Pekka 您可以提供要使用的文件的完整路径。我将对其他问题发表评论。
  • 顺便说一下,由于这个问题的答案比上面提到的其他问题要好得多,我已经调整了这个问题的标题/正文以提高可读性,希望这成为规范的资源这个话题。

标签: php cookies curl


【解决方案1】:

CURLOPT_COOKIEJARCURLOPT_COOKIEFILE 只是用于处理文件中的 cookie 的实用程序,例如 Web 浏览器。 对于您的情况,不建议这样做。

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

用于设置 cookie

<?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);

【讨论】:

  • 我想在下一组 curl 命令中使用 cookie.. 而 curl 只允许从文件中检索.. 所以如果我也识别,如何将它传递给下一个 curl 语句?
【解决方案2】:

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

您可能想看看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)? 问题。

【讨论】:

  • 如果您要使用tempnam() 创建文件名,每个请求都会有所不同。因此您将无法为后续请求重用任何 cookie。
  • @Kris 好点 - 我将在稍后调整示例。感谢您的提醒。 :-)
【解决方案3】:

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

您可以将session_id() 合并到cookie 文件名中,这样您就可以为每个客户端会话创建一个cookie 文件。我还建议将文件存储在 sys_get_temp_dir() 之类的地方。

类似:

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

应该可以正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-21
    • 2015-02-18
    • 1970-01-01
    • 2015-04-07
    • 2018-07-24
    • 2012-02-20
    • 2012-04-27
    • 1970-01-01
    相关资源
    最近更新 更多