Я выполняю некоторую работу 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, "");
Для получения дополнительной информации см. Мой ответ в комментариях