34

我在 php 5.3.0 中做一些 cURL 工作。

我想知道是否有任何方法可以告诉 curl 句柄/对象将 cookie 保留在内存中(假设我对多个请求重用相同的句柄),或者以某种方式返回它们并让我在制作时将它们传回新手柄。

Theres 这种长期接受的方法可以让他们进入/退出请求:

curl_setopt($ch, CURLOPT_COOKIEJAR, $filename); 
curl_setopt($ch, CURLOPT_COOKIEFILE, $filename);

但是我遇到了一些场景,我需要在同一个目录中运行脚本的多个副本,并且它们会相互踩踏对方的 cookie 文件。是的,我知道我可以使用 tempnam() 并确保每次运行都有自己的 cookie 文件,但这导致了我的第二个问题。

还有一个问题是根本没有将这些 cookie 文件放在磁盘上。磁盘 I/O 很慢,我敢肯定这是一个瓶颈。我不想在脚本完成后清理 cookie 文件(如果它甚至以一种让我清理它的方式退出)。

有任何想法吗?还是事情就是这样?

4

6 回答 6

27

不幸的是,我认为您不能使用 'php://memory' 作为输入和输出流。解决方法是自己解析标头。这可以很容易地完成。这是一个发出两个请求并自己传递 cookie 的页面示例。

卷曲.php:

<?php

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'http://localhost/test.php?message=Hello!');
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, false);
curl_setopt($curl, CURLOPT_HEADER, true);  
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 

$data = curl_exec($curl);
curl_close($curl);

preg_match_all('|Set-Cookie: (.*);|U', $data, $matches);   
$cookies = implode('; ', $matches[1]);

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'http://localhost/test.php');
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, false);
curl_setopt($curl, CURLOPT_HEADER, true);  
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($curl, CURLOPT_COOKIE, $cookies);

$data = curl_exec($curl);
echo $data;

?>

测试.php:

<?php
session_start();
if(isset($_SESSION['message'])) {
    echo $_SESSION['message'];
} else {
    echo 'No message in session';
}

if(isset($_GET['message'])) {
    $_SESSION['message'] = $_GET['message'];
}
?>

这将输出“你好!” 在第二个请求。

于 2009-09-28T11:03:09.140 回答
26

您可以使用该CURLOPT_COOKIEJAR选项,并将文件设置为 " /dev/null" 对于Linux / MacOS X或 " NULL" 对于Windows。这将防止 cookie 被写入磁盘,但只要您重用句柄并且不调用curl_easy_cleanup().

于 2009-09-29T03:46:27.633 回答
12

只需将 CURLOPT_COOKIEFILE 设置为不存在的文件,通常空字符串是最佳选择。然后不要设置 CURLOPT_COOKIEJAR,这就是诀窍。这将阻止文件被写入,但 cookie 将保留在内存中。我刚刚对此进行了测试,它可以正常工作(我的测试:将 http auth 数据发送到一个 URL,该 URL 将您重定向到对请求进行身份验证的登录 URL,然后将您重定向回带有 cookie 的原始 URL)。

于 2011-04-22T18:05:31.670 回答
3

有,但它完全不直观。

curl_setopt($curl, CURLOPT_COOKIEFILE, "");

更多详情请在评论中查看我的回答

于 2017-10-16T10:12:16.523 回答
2

如果使用 Linux,您可以将它们设置为指向 /dev/shm 中的某个位置。这会将它们保存在内存中,并且您可以确保它们不会在重新启动后持续存在。

我不知何故认为 Curl 的清理处理了 cookie 的取消链接,但我可能弄错了。

于 2009-09-28T09:13:35.913 回答
0

对我有用的是使用此设置:

curl_setopt($ch, CURLOPT_HEADER, 1);

然后解析结果。在这篇博客文章中的详细信息,我发现了如何做到这一点。
由于那是旧的,这里有一个替换不推荐使用的功能的要点

于 2014-01-31T18:34:37.977 回答