2009-09-28 11 views
30

Estoy haciendo un trabajo de cURL en php 5.3.0.Cualquier forma de mantener las cookies de curl en la memoria y no en el disco

Me pregunto si hay alguna manera de decirle a la manija/objeto curl que conserve las cookies en la memoria (asumiendo que estoy reutilizando el mismo identificador para múltiples solicitudes), o de alguna manera devolverlas y dejarme pasarlas cuando se hace un nuevo mango.

Theres este método aceptado desde hace tiempo para conseguir que de entrada/salida de la solicitud:

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

Pero estoy golpeando algunos escenarios en los que tengo que estar ejecutando varias copias de una secuencia de comandos fuera del mismo directorio, y pisa los archivos de las galletas de los demás. Sí, sé que podría usar tempnam() y asegurarme de que cada ejecución tenga su propio archivo de cookies, pero eso me lleva a mi segundo problema.

También existe la cuestión de tener estos archivos de cookies en el disco. La E/S de disco es lenta y el cuello de una botella, estoy seguro. No quiero tener que ocuparme de limpiar el archivo de cookies cuando finalice el guión (si incluso sale de una manera que me permita limpiarlo).

¿Alguna idea? ¿O es así como son las cosas?

+7

Honestamente, no creo que tendrá que ser la preocupación de disco I/O cuando estás haciendo la red de E/S. – NSSec

Respuesta

23

Usted puede utilizar la opción CURLOPT_COOKIEJAR, y establecer el archivo a "/dev/null" para Linux/MacOS X o "NULL" para de Windows. Esto evitará que las cookies se escriban en el disco, pero las mantendrá en la memoria siempre que reutilice el identificador y no llame al curl_easy_cleanup().

+0

¿Entonces las cookies serán válidas hasta que se llame a curl_close()? ¿Has probado esto? –

+14

Leí el código fuente de libcurl para verificar esto antes de publicar. –

+2

Lo he intentado y parece que no funciona. Ni en Windows ni en * nix. –

2

Si usa Linux, puede configurarlos para que apunten a algún lugar dentro de/dev/shm ... esto los mantendrá en la memoria y puede estar seguro de que no persistirán durante los reinicios.

De alguna manera pensé que la limpieza de Curl manejaba la desvinculación de las cookies, pero podría estar equivocado.

+0

¿Podría proporcionar una implementación en funcionamiento? –

25

Desafortunadamente, no creo que pueda usar 'php: // memory' como flujo de entrada y salida. La solución alternativa es analizar los encabezados usted mismo. Esto se puede hacer con bastante facilidad. Aquí hay un ejemplo de una página que realiza dos solicitudes y pasa las cookies usted mismo.

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; 

?> 

prueba.php: 'Hola'

<?php 
session_start(); 
if(isset($_SESSION['message'])) { 
    echo $_SESSION['message']; 
} else { 
    echo 'No message in session'; 
} 

if(isset($_GET['message'])) { 
    $_SESSION['message'] = $_GET['message']; 
} 
?> 

Esta voluntad de salida en la segunda solicitud

+2

Este código me ayudó enormemente gracias –

+2

Tenga en cuenta que si analiza las cookies más de una vez en una secuencia de solicitudes, puede que tenga que acumular las cookies en su cadena, posiblemente sobrescribiendo los valores anteriores con los más nuevos para las claves que vuelven a aparecer. (..¡y comienza la pendiente resbaladiza para implementar un tarro de galletas!) –

8

Simplemente configure CURLOPT_COOKIEFILE en un archivo que no existe, por lo general, una cadena vacía es la mejor opción. Entonces NO establezca CURLOPT_COOKIEJAR, este es el truco. Esto evitará que se escriba un archivo, pero las cookies permanecerán en la memoria. Acabo de probar esto y funciona (mi prueba: enviar datos http auth a una URL que lo redirecciona a una URL de inicio de sesión que autentica la solicitud, luego lo redirige a la URL original con una cookie).

+1

Brillante, esto era exactamente lo que estaba buscando. Establecí 'CURLOPT_COOKIEFILE' en' null' y me abstuve de configurar la opción 'CURLOPT_COOKIEJAR', ¡y funcionó! – silkfire

Cuestiones relacionadas