Подтвердить что ты не робот

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

Я выполняю работу 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 (если он даже выходит таким образом, чтобы я мог его очистить).

Любые идеи? Или это так, как есть?

4b9b3361

Ответ 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 обрабатывает отключение куки файлов, но я могу ошибаться.