我试图避免cURL通过"CURLOPT_COOKIEJAR"将cookie会话存储到实际文件中.所以我创建了一个方法来捕获/解析cookie到一个局部变量 - 然后通过"CURLOPT_COOKIE"来恢复cookie会话.
我通过切出饼干
preg_match_all("/^Set-cookie: (.*?);/ism", $header, $cookies);
要使用"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 问题解决了 - 在下面回答了我自己.
所以事实证明我实际上正确地做了这个,我的假设是正确的.
将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) ); }
这将允许您保持最新变量(即更改会话)完整.
希望这有助于任何碰到这个问题的人!