PHP: utilizzo di cURL per archiviare la session di cookie in variabile / memory

Sto cercando di evitare che cURL memorizzi la session di cookie in un file reale tramite "CURLOPT_COOKIEJAR". Così ho creato un metodo per catturare / analizzare i cookie in una variabile locale, che viene poi utilizzata tramite "CURLOPT_COOKIE" per ripristinare la session di cookie.

Ho tagliato i biscotti via

preg_match_all("/^Set-cookie: (.*?);/ism", $header, $cookies); 

Per utilizzare "CURLOPT_COOKIE" prendiamo il valore chiave = e li separiamo tramite ";". Tuttavia (come sono a conoscenza), CURLOPT_COOKIE non ti consente di lanciare vari flag con scadenza, flag di sicurezza e così via.

Aggiornamento 29/01/2014 18:45

Quindi penso che il mio problema si verifichi effettivamente where si verifica CURLOPT_FOLLOWLOCATION. Non penso che abbia a che fare con le bandiere. Non sembra che la session di cookie manuale che ho si stia aggiornando quando si segue una nuova posizione (ovvero un sito ha 2-3 reindirizzamenti per aggiungere vari cookie / session). Il che avrebbe in realtà senso perché l'utilizzo di CURLOPT_COOKIEJAR catturerà / aggiornerà direttamente i cookie inviati sui reindirizzamenti delle intestazioni. Così, ho provato a creare un path di reindirizzamento manuale mentre aggiungo / accodando il cookie più recente, tuttavia questo metodo non ha funzionato per un semplice motivo.

Aggiornamento 30/01/2014 16.22

Quasi capito. Sarà aggiornato con risposta a breve. Si scopre che il mio metodo funziona perfettamente, si tratta semplicemente di saltare correttamente le pagine reindirizzate manualmente.

Aggiornamento 30/01/2014 16.51 Problema risolto – ho risposto a me stesso di seguito.

Quindi risulta che stavo effettivamente facendo questo correttamente e le mie supposizioni erano corrette.

  1. Per mantenere la session di cookie in una variabile (vs CURLOPT_COOKIEJAR). * Assicurati di avere CURLOPT_HEADER e CURLINFO_HEADER_OUT abilitati. *

  2. CURLOPT_FOLLOWLOCATION deve essere impostato su false. Altrimenti il ​​tuo cookie non verrà inviato correttamente (questo è where CURLOPT_COOKIEJAR fa meglio).

  3. Usa preg_match_all per estrarre i cookie. Quindi usa strpos per trovare la prima occorrenza di "=". Alcuni siti usano la codifica e includono "=" che non funzionano con "esplode".

     $data = curl_exec($curl); $header_size = curl_getinfo($curl, CURLINFO_HEADER_SIZE); $header = substr($data, 0, $header_size); preg_match_all("/^Set-cookie: (.*?);/ism", $header, $cookies); foreach( $cookies[1] as $cookie ){ $buffer_explode = strpos($cookie, "="); $this->cookies[ substr($cookie,0,$buffer_explode) ] = substr($cookie,$buffer_explode+1); } 
  4. Quando effettui la tua prossima ricorrenza, richiama nuovamente il cookie var / object in CURLOPT_COOKIE.

     if( count($this->cookies) > 0 ){ $cookieBuffer = arrays(); foreach( $this->cookies as $k=>$c ) $cookieBuffer[] = "$k=$c"; curl_setopt($curl, CURLOPT_COOKIE, implode("; ",$cookieBuffer) ); } 

Questo ti permetterà di mantenere intatta la variabile più recente (cioè cambiare session).

Spero che questo aiuti chiunque si imbatta in questo problema!