任何方式将curl的cookie保存在内存而不是磁盘上

时间:2009-09-28 09:09:18

标签: php curl diskspace

我在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文件(如果它甚至以允许我清理它的方式退出)。

有什么想法吗?或者这只是事情的方式?

6 个答案:

答案 0 :(得分:26)

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

curl.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;

?>

test.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'];
}
?>

这将输出'Hello!'在第二个请求。

答案 1 :(得分:24)

您可以使用CURLOPT_COOKIEJAR选项,并为 Linux / MacOS X 或“/dev/null”将文件设置为“NULL”视窗即可。这样可以防止将cookie写入磁盘,但只要重用句柄并且不调用curl_easy_cleanup(),它就会将它们保留在内存中。

答案 2 :(得分:9)

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

答案 3 :(得分:2)

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

我不知何故认为Curl的清理处理了cookie的断开连接,但我可能会弄错。

答案 4 :(得分:2)

但它确实完全不直观。

curl_setopt($curl, CURLOPT_COOKIEFILE, "");

有关详细信息,请参阅my answer in the comments

答案 5 :(得分:0)

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

curl_setopt($ch, CURLOPT_HEADER, 1);

然后解析结果。 this blog post中的详细信息,我在那里了解了如何执行此操作 由于这是旧的,这里是gist replacing deprecated functions