Domanda

Sto facendo un certo lavoro cURL in PHP 5.3.0.

Mi chiedo se non v'è alcun modo per dire al manico / oggetto ricciolo per mantenere i cookie in memoria (assumendo sto riutilizzare lo stesso manico per richieste multiple), o di restituirli e farmi passare di nuovo in qualche modo quando si effettua una nuova maniglia.

C'è questo metodo da tempo accettato per loro entrare in / out della richiesta:

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

Ma sto colpendo alcuni scenari in cui ho bisogno di essere in esecuzione più copie di uno script dalla stessa directory, e fanno un passo su ogni file altri biscotti. Sì, lo so che potrei usare tempnam () e assicurarsi che ogni corsa ha un proprio file cookie, ma che mi porta al mio secondo problema.

C'è anche il problema di avere questi file cookie sul disco a tutti. Disco I / O è lento e un collo di bottiglia sono sicuro. Non voglio avere a che fare con la pulizia del file cookie quando lo script è terminato (se esce anche in modo che mi permette di pulirlo).

Tutte le idee? O è solo il modo in cui stanno le cose?

È stato utile?

Soluzione

È possibile utilizzare l'opzione CURLOPT_COOKIEJAR, e impostare il file in "/dev/null" per Linux / MacOS X o "NULL" per di Windows . Questo consentirà di evitare i cookie di essere scritti su disco, ma sarà tenerli in giro in memoria fino a quando si riutilizza il manico e non si chiama curl_easy_cleanup().

Altri suggerimenti

Purtroppo, non credo che si può usare 'php: // memoria' come il flusso di input e di output. La soluzione è di analizzare le intestazioni da soli. Questo può essere fatto abbastanza facilmente. Ecco un esempio di una pagina fare due richieste e passando i biscotti da soli.

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'];
}
?>

Questa uscita volonta 'Ciao!' sulla seconda richiesta.

È sufficiente impostare CURLOPT_COOKIEFILE a un file che non esiste, di solito una stringa vuota è l'opzione migliore. Quindi NON impostato CURLOPT_COOKIEJAR, questo è il trucco. Questo consentirà di evitare che un file venga scritto, ma i biscotti rimarrà nella memoria. Ho appena provato questo e funziona (il mio test: inviare i dati http auth a un URL che reindirizza a un URL di accesso che autentica la richiesta, allora si reindirizza all'URL originale con un biscotto).

Se si utilizza Linux, è possibile impostare questi al punto da qualche parte all'interno di / dev / shm .. questo li terrà in memoria e si può essere certi che non saranno persistono attraverso riavvii.

In qualche modo pensato che la pulizia di Curl gestito lo scollegamento di biscotti, ma potrei sbagliarmi.

Non c'è che è completamente intuitivo.

curl_setopt($curl, CURLOPT_COOKIEFILE, "");

Per maggiori dettagli consulta mia risposta nei commenti

Ciò che funziona per me sta usando questa impostazione:

curl_setopt($ch, CURLOPT_HEADER, 1);

E poi l'analisi del risultato. Dettagli in questo post blog dove ho scoperto come fare questo.
E dal momento che è vecchio, ecco una succo che sostituiscono le funzioni deprecate .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top