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

MKN*_*ons 2 php cookies session curl

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

我通过切出饼干

preg_match_all("/^Set-cookie: (.*?);/ism", $header, $cookies);
Run Code Online (Sandbox Code Playgroud)

要使用"CURLOPT_COOKIE",我们取key =值并通过";"分隔它们.但是(据我所知),CURLOPT_COOKIE不允许你输入各种标志即到期,安全标志等等.

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

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

2014年1月30日下午4:22更新

几乎得到了这个想法.将很快回复更新.事实证明我的方法完美无缺,只需要正确跳过手动重定向页面即可.

更新1/30/2014 4:51 pm 问题解决了 - 在下面回答了我自己.

MKN*_*ons 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);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  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) );
    }
    
    Run Code Online (Sandbox Code Playgroud)

这将允许您保持最新变量(即更改会话)完整.

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