2014-01-29 134 views
2

我試圖避免cURL通過「CURLOPT_COOKIEJAR」將cookie會話存儲到實際文件中。所以我創建了一個方法來將cookies解析爲局部變量 - 然後通過「CURLOPT_COOKIE」來恢復cookie會話。PHP - 使用cURL將cookie會話存儲到變量/內存中

我通過

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

切出的餅乾要使用 「CURLOPT_COOKIE」 我們採取的是key = value,並通過它們分開 「;」。然而(據我所知),CURLOPT_COOKIE不允許你扔各種旗幟,即。到期,安全標誌等。

更新2014年1月29日下午6:45

所以我覺得在那裏發生CURLOPT_FOLLOWLOCATION實際發生我的問題。我不認爲這與國旗有關。它似乎不像我手動cookie會話正在更新時遵循一個新的位置(即一個網站有2-3重定向追加各種cookie /會話)。這實際上是有道理的,因爲使用CURLOPT_COOKIEJAR將直接獲取/更新頭重定向上發送的cookie。所以,我嘗試在抓取/追加最新的cookie的同時創建手動重定向路徑 - 但是由於某種原因,此方法不起作用。

更新二零一四年一月三十零日下午4:22

幾乎得到這個想通了。很快就會用答案更新。事實證明,我的方法工作得很好,只是正確跳過手動重定向頁面的問題。

更新1/30/2014 4:51 pm 問題解決了 - 下面回答自己。

+2

但是你可以使用curlopt頭來設置cookies,嗯? –

+1

@ MaximKhan-Magomedov我們使用curlopt頭來設置cookie,但不能存儲。cURL使用cookiejar - 但需要在磁盤上有固定文件,這就是您想要避免的情況(在大規模生產環境中)。將cookie會話留在磁盤上存在安全風險。 –

回答

7

所以事實證明我確實正確地做了這件事,我的假設是正確的。

  1. 保持Cookie會話在一個變量(與CURLOPT_COOKIEJAR)。 *確保您啓用了CURLOPT_HEADER和CURLINFO_HEADER_OUT。*

  2. CURLOPT_FOLLOWLOCATION必須設置爲false。否則你的cookie將無法正確發送(這是CURLOPT_COOKIEJAR最好的地方)。

  3. 使用preg_match_all來提取cookie。然後使用strpos找到「=」的第一個出現。有些網站使用編碼,幷包含「=」,它不會與「爆炸」一起使用。

    $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. 使得當你的下一個捲曲電話,再撥打該cookie VAR /對象爲CURLOPT_COOKIE。

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

這將讓你保持最新的變量(即改變會話)不變。

希望這可以幫助任何碰到這個問題的人!