Любой способ сохранить куки-файлы в памяти, а не на диске

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

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

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

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

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

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

Есть идеи? Или это так?

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

К сожалению, я не думаю, что вы можете использовать «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!' по второму запросу.

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

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

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

Для меня это работает:

 curl_setopt($ch, CURLOPT_HEADER, 1); 

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

Есть, но это совершенно неинтуитивно.

 curl_setopt($curl, CURLOPT_COOKIEFILE, ""); 

Для получения дополнительной информации см. Мой ответ в комментариях