PHP - 使用cURL将cookie会话存储到变量/内存中

时间:2014-01-29 21:25:14

标签: php session cookies curl

我试图避免cURL通过“CURLOPT_COOKIEJAR”将cookie会话存储到实际文件中。所以我创建了一个方法来捕获/解析cookie到一个局部变量 - 然后通过“CURLOPT_COOKIE”来恢复cookie会话。

我通过

剪切了饼干
preg_match_all("/^Set-cookie: (.*?);/ism", $header, $cookies);

要使用“CURLOPT_COOKIE”,我们取key = value并通过“;”分隔它们。但是(正如我所知),CURLOPT_COOKIE不允许你输入各种标志I.e.到期,安全标志等。

2014年1月29日下午6:45

更新

所以我认为我的问题实际发生在发生CURLOPT_FOLLOWLOCATION的地方。我不认为这与旗帜有关。在跟随新位置(即网站有2-3个重定向以附加各种cookie /会话)时,我似乎没有更新手动cookie会话。这实际上是有意义的,因为利用CURLOPT_COOKIEJAR将直接获取/更新在头重定向上发送的cookie。所以,我尝试在抓取/附加最新的cookie时创建一个手动重定向路径 - 但是这种方法并不适用于某些原因。

2014年1月30日下午4:22

几乎弄明白这一点。将很快回复更新。事实证明我的方法完美无缺,只需要正确跳过手动重定向页面即可。

2014年1月30日下午4:51 更新 问题解决了 - 在下面自己回答。

1 个答案:

答案 0 :(得分: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. 进行下一次curl调用时,请将cookie var / object重新调用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) );
    }
    
  5. 这将允许您保持最新变量(即更改会话)的完整。

    希望这有助于任何碰到这个问题的人!