我在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文件(如果它甚至以允许我清理它的方式退出)。
有什么想法吗?或者这只是事情的方式?
答案 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)
答案 5 :(得分:0)
对我有用的是使用此设置:
curl_setopt($ch, CURLOPT_HEADER, 1);
然后解析结果。 this blog post中的详细信息,我在那里了解了如何执行此操作 由于这是旧的,这里是gist replacing deprecated functions。