2014-01-29 135 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)); 
    } 
    

这将让你保持最新的变量(即改变会话)不变。

希望这可以帮助任何碰到这个问题的人!