Любой способ сохранить завитки куки в памяти, а не на диске
Я выполняю работу cURL в php 5.3.0.
Мне интересно, есть ли способ сказать ручку/объект curl сохранить файлы cookie в памяти (при условии, что я повторно использую один и тот же дескриптор для нескольких запросов) или как-то вернуть их и позволить мне передать их обратно при создании нового дескриптора.
Этот длинный принятый метод для их ввода/выхода из запроса:
curl_setopt($ch, CURLOPT_COOKIEJAR, $filename);
curl_setopt($ch, CURLOPT_COOKIEFILE, $filename);
Но я сталкиваюсь с некоторыми сценариями, когда мне нужно запустить несколько копий script из одного и того же каталога, и они накладывают друг на друга файлы cookie. Да, я знаю, что могу использовать tempnam() и убедиться, что каждый запуск имеет свой файл cookie, но это приводит меня к моей второй проблеме.
Существует также проблема наличия этих файлов cookie на диске вообще. Диск ввода-вывода медленный, и я уверен, что бутылочная горловина. Я не хочу иметь дело с очисткой файла cookie при завершении script (если он даже выходит таким образом, чтобы я мог его очистить).
Любые идеи? Или это так, как есть?
Ответы
Ответ 1
Вы можете использовать опцию CURLOPT_COOKIEJAR
и установить для файла <<21 > для Linux/MacOS X или "NULL
" для Windows. Это предотвратит запись файлов cookie на диск, но они будут содержать их в памяти до тех пор, пока вы повторно используете дескриптор и не вызываете curl_easy_cleanup()
.
Ответ 2
К сожалению, я не думаю, что вы можете использовать "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!' по второму запросу.
Ответ 3
Просто установите CURLOPT_COOKIEFILE в файл, который не существует, обычно это пустая строка. Тогда НЕ устанавливайте CURLOPT_COOKIEJAR, это трюк. Это предотвратит запись файла, но файлы cookie будут оставаться в памяти. Я просто проверил это, и он работает (мой тест: отправьте HTTP-данные auth на URL-адрес, который перенаправляет вас на URL-адрес входа, который проверяет подлинность запроса, а затем перенаправляет вас обратно к исходному URL-адресу с файлом cookie).
Ответ 4
Если вы используете Linux, вы можете указать, что они указывают где-то внутри /dev/shm.. это сохранит их в памяти, и вы можете быть уверены, что они не будут сохраняться при повторной загрузке.
Я как-то подумал, что очистка Curl обрабатывает отключение куки файлов, но я могу ошибаться.
Ответ 5
Что работает для меня, используйте этот параметр:
curl_setopt($ch, CURLOPT_HEADER, 1);
И затем разбор результатов. Подробности в в этом сообщении в блоге, где я узнал, как это сделать.
И поскольку это старо, вот gist заменяет устаревшие функции.
Ответ 6
Есть, но это совершенно неинтуитивно.
curl_setopt($curl, CURLOPT_COOKIEFILE, "");
Подробнее см. мой ответ в комментариях