首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在使用cURL的CURLOPT_COOKIEFILE选项时处理多个请求

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

Stack Overflow用户
提问于 2011-01-26 22:58:30
回答 3查看 2.2K关注 0票数 4

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

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

EN

回答 3

Stack Overflow用户

发布于 2011-01-26 23:05:55

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

您可能希望将tempnam (下面的示例)作为生成唯一文件的一种方式,或者简单地使用uniqid等,然后自己创建该文件。

代码语言:javascript
复制
<?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)?问题是怎么说的。

票数 3
EN

Stack Overflow用户

发布于 2011-01-26 23:13:54

CURLOPT_COOKIEJARCURLOPT_COOKIEFILE只是在文件中处理cookies的实用程序,就像web浏览器一样。对你的情况不推荐这样做。

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

为你设置cookie

代码语言:javascript
复制
<?php
curl_setopt($ch, CURLOPT_COOKIE, 'user=xxxxxxxx-xxxxxxxx');
?>

要检索cookies,只需识别以Set-Cookie:开头的头文件

您可以查看本文以了解cookie标头如何在http://curl.haxx.se/rfc/cookie_spec.html中工作

使用示例,快速和肮脏,但绝对不是标准的

使用此标头

代码语言:javascript
复制
<?php
$header_blob = '
Set-Cookie: PART_NUMBER=ROCKET_LAUNCHER_0001; path=/
Set-Cookie: PART_NUMBER=RIDING_ROCKET_0023; path=/ammo
';

提取cookie标头

代码语言:javascript
复制
$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);

重新发送cookies

代码语言:javascript
复制
$cookie_blob = implode('; ', $cookies);
var_dump($cookie_blob);
票数 3
EN

Stack Overflow用户

发布于 2011-01-26 23:10:53

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

您可以将session_id()合并到cookie文件名中,以便每个客户端会话都有一个cookie文件。我还建议将这些文件存储在类似sys_get_temp_dir()的文件中。

类似于:

代码语言:javascript
复制
$cookieFile = sys_get_temp_dir().PATH_SEPARATOR.session_id().'-cookies.txt';

应该可以很好地解决这个问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4805984

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档