我试图避免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 更新 问题解决了 - 在下面自己回答。
答案 0 :(得分:7)
事实证明我实际上正确地做到了这一点并且我的假设是正确的。
将cookie会话保存在变量中(与CURLOPT_COOKIEJAR对比)。 *确保已启用CURLOPT_HEADER和CURLINFO_HEADER_OUT。*
必须将CURLOPT_FOLLOWLOCATION设置为false。否则你的cookie将无法正确发送(这是CURLOPT_COOKIEJAR最擅长的地方)。
使用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);
}
进行下一次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) );
}
这将允许您保持最新变量(即更改会话)的完整。
希望这有助于任何碰到这个问题的人!