Любой способ сохранить cookies curl в памяти, а не на диске

Я делаю некоторую работу cURL в php 5.3.0.

Мне интересно, есть ли способ сказать ручке/объекту curl, чтобы сохранить куки в памяти (предполагая, что я повторно использую один и тот же дескриптор для нескольких запросов) или каким-то образом вернуть их и позволить мне передать их обратно при создании нового дескриптора.

Theres этот давно принятый метод для получения их в / из запроса:

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

но я попадаю в некоторые сценарии, где мне нужно запустить несколько копий сценарий из того же каталога, и они наступают друг на друга файлы cookie. Да, я знаю, что могу использовать tempnam() и убедиться, что каждый запуск имеет свой собственный файл cookie, но это приводит меня к моей 2-й проблеме.

существует также проблема наличия этих файлов cookie на диске вообще. Дисковый ввод-вывод медленный, и я уверен, что горлышко бутылки. Я не хочу иметь дело с очисткой файла cookie, когда скрипт закончен (если он даже выходит таким образом, что позволяет мне очистить его).

любой идеи? Или все так и есть?

6 ответов


можно использовать CURLOPT_COOKIEJAR опции и выберите файл "/dev/null" для Linux / MacOS X или "NULL" для Windows. Это предотвратит запись файлов cookie на диск, но сохранит их в памяти до тех пор, пока вы повторно используете дескриптор и не вызываете curl_easy_cleanup().


к сожалению, я не думаю, что вы можете использовать 'php://memory' в качестве входного и выходного потока. Обходной путь-самостоятельно проанализировать заголовки. Это можно сделать довольно легко. Вот пример страницы, делая два запроса и передачей маркеров.

завиток.на 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;

?>

просто установите CURLOPT_COOKIEFILE в файл, который не существует, обычно пустая строка является лучшим вариантом. Тогда не устанавливайте CURLOPT_COOKIEJAR, это трюк. Это предотвратит запись файла, но файлы cookie останутся в памяти. Я только что протестировал это, и это работает (мой тест: отправьте данные http auth на URL-адрес, который перенаправляет вас на URL-адрес входа, который аутентифицирует запрос, а затем перенаправляет вас обратно на исходный URL-адрес с помощью cookie).


Если вы используете Linux, вы можете установить их где-то внутри /dev/shm .. это сохранит их в памяти, и вы можете быть уверены, что они не будут сохраняться в повторных ботинках.

Я почему-то думал, что очистка Curl справилась с отключением печенья, но я мог ошибаться.


есть, но это совершенно нелогично.

curl_setopt($curl, CURLOPT_COOKIEFILE, "");

Подробнее см. мой ответ в комментариях


то, что работает для меня, использует эту настройку:

curl_setopt($ch, CURLOPT_HEADER, 1);

и затем разбор результата. Подробности в этот блог где я узнал, как это сделать.
И так как это старый, вот gist замена устаревших функций.