任何将 curl 的 Cookie 保存在内存中而不是磁盘上的方法

2022-08-30 13:37:19

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

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

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

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

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

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

有什么想法吗?还是事情就是这样?


答案 1

您可以使用该选项,并将文件设置为“”(对于Linux / MacOS X)或“”(对于Windows)。这将阻止 Cookie 写入磁盘,但只要您重复使用句柄并且不调用 ,它就会将它们保留在内存中。CURLOPT_COOKIEJAR/dev/nullNULLcurl_easy_cleanup()


答案 2

不幸的是,我认为你不能使用“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'];
}
?>

这将在第二个请求中输出“Hello!”。


推荐