2009-09-28 9 views
30

Sto facendo alcuni lavori cURL in php 5.3.0.Qualsiasi modo per mantenere i cookie di arricciatura in memoria e non sul disco

Mi chiedo se c'è un modo per dire al manico/oggetto di curl di conservare i cookie in memoria (supponendo che sto riutilizzando lo stesso handle per più richieste), o in qualche modo restituirli e lasciarmi passare indietro quando si effettua una nuova maniglia.

Theres 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 passano l'uno sull'altro i file dei cookie. Sì, so che potrei usare tempnam() e assicurarmi che ogni esecuzione abbia il suo file cookie, ma questo mi porta al mio secondo problema.

C'è anche il problema di avere questi file cookie sul disco. 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 è finito (se esce anche in un modo che mi permette di ripulirlo).

Qualche idea? O è così come stanno le cose?

+7

Onestamente, non credo che sarà necessario essere preoccuparsi disco I/O quando si sta facendo rete di I/O. – NSSec

risposta

23

È possibile utilizzare l'opzione CURLOPT_COOKIEJAR, e impostare il file in "/dev/null" per Linux/MacOS X o "NULL" per di Windows. Ciò impedirà che i cookie vengano scritti su disco, ma li terrà in memoria finché si riutilizza l'handle e non si chiama curl_easy_cleanup().

+0

Quindi i cookie saranno validi fino a quando viene chiamato curl_close()? Hai provato questo? –

+14

Ho letto il codice sorgente di libcurl per verificarlo prima di postare. –

+2

L'ho provato e non sembra funzionare. Né su Windows né su * nix. –

2

Se si utilizza Linux, è possibile impostarli in modo che puntino da qualche parte all'interno di/dev/shm .. questo li manterrà in memoria e si può essere certi che non persisteranno tra i riavvii.

Ho in qualche modo pensato che la pulizia di Curl gestisse lo scollegamento dei cookie, ma potrei sbagliarmi.

+0

Potresti fornire un'implementazione funzionante? –

25

Sfortunatamente, non penso che sia possibile utilizzare "php: // memory" come flusso di input e output. La soluzione alternativa è analizzare da soli le intestazioni. Questo può essere fatto abbastanza facilmente. Ecco un esempio di una pagina che fa due richieste e passa i cookie da solo.

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: '! Ciao'

<?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 volontà di uscita sulla seconda richiesta.

+2

Questo codice mi ha aiutato moltissimo grazie –

+2

Si noti che se si analizzano i cookie più di una volta in una sequenza di richieste, potrebbe essere necessario accumulare i cookie nella stringa, eventualmente sovrascrivendo i valori precedenti con quelli più recenti per le chiavi ricorrenti. (..e la pendenza scivolosa per l'implementazione di un barattolo di biscotti inizia!) –

8

Basta impostare CURLOPT_COOKIEFILE su un file che non esiste, in genere una stringa vuota è l'opzione migliore. Quindi NON impostare CURLOPT_COOKIEJAR, questo è il trucco. Ciò impedirà la scrittura di un file, ma i cookie rimarranno in memoria. L'ho appena testato e funziona (il mio test: invia i dati di autenticazione http a un URL che ti reindirizza a un URL di accesso che autentica la richiesta, quindi reindirizza all'URL originale con un cookie).

+1

Brillante, questo era esattamente quello che stavo cercando. Ho impostato 'CURLOPT_COOKIEFILE' su' null' e mi sono astenuto dall'impostare l'opzione 'CURLOPT_COOKIEJAR', e ha funzionato! – silkfire

Problemi correlati