Home >Backend Development >PHP Tutorial >php curl 有个问题请指教

php curl 有个问题请指教

WBOY
WBOYOriginal
2016-06-06 20:31:351062browse

最近一直在学curl
以前也用过,但是没有很深入
现在遇到一个问题,各种搜索都搜了,无解
来问一下:
curl 可以使用cookie

我的方法是
$cookies是个绝对路径
curl_setopt($curl, CURLOPT_COOKIEJAR, $cookies);//将cookie写入,这个没问题
curl_setopt($curl2, CURLOPT_COOKIEFILE, $cookies); //使用存好的cookie
始终不成功,不能读到存好的cookie
然后使用
curl_setopt($curl2, CURLOPT_HEADER, true);//输出头
头显示根本未使用存好的cookie
尝试了各种方法
curl_setopt($curl2, CURLOPT_COOKIEFILE, $cookies);//这句'使用存好的cookie'根本没用

请问哪里的姿势错了?

回复内容:

最近一直在学curl
以前也用过,但是没有很深入
现在遇到一个问题,各种搜索都搜了,无解
来问一下:
curl 可以使用cookie

我的方法是
$cookies是个绝对路径
curl_setopt($curl, CURLOPT_COOKIEJAR, $cookies);//将cookie写入,这个没问题
curl_setopt($curl2, CURLOPT_COOKIEFILE, $cookies); //使用存好的cookie
始终不成功,不能读到存好的cookie
然后使用
curl_setopt($curl2, CURLOPT_HEADER, true);//输出头
头显示根本未使用存好的cookie
尝试了各种方法
curl_setopt($curl2, CURLOPT_COOKIEFILE, $cookies);//这句'使用存好的cookie'根本没用

请问哪里的姿势错了?

你可以尝试在请求之前执行一次curl,获取的cookies,存到变量中

你先搞清楚,CURLOPT_HEADER 的含义是什么,如果不加这个,你执行的结果只会有服务端返回的body体,而没有header。加了这个,那么就会将服务端返回的header头和body内容体一起输出。

所以你在这里打cookie当然不会有,你要查的是发送的头里面有没有cookie,但你却在返回的头里找。

你应该在同域名下的写一个这样的PHP:cookie.php

<code><?php var_dump($_COOKIE);
</code></code>

在你第一次种上cookie后再用代码curl访问一下,你就知道你cookie有没有用上了。

对的,这是很多人容易犯下的一个错误,你第一次打印cookie的时候,浏览器还没有种下cookie呢【因为之前的header没有发送cookie信息】,第二次刷新的话因为你第一次已经发送了header 带有cookie信息,所以你打印cookie信息【这里的cookie值得是浏览器返回的cookie】就有了

$cookies = http_build_query($_COOKIE, null, ";");

<code>curl_setopt($curl, CURLOPT_COOKIEJAR, $cookies);//将cookie写入,这个没问题
curl_setopt($curl2, CURLOPT_COOKIEFILE, $cookies); //使用存好的cookie
curl_setopt($curl2, CURLOPT_HEADER, true);//输出头
curl_setopt($curl2, CURLOPT_COOKIEFILE, $cookies);//这句'使用存好的cookie'根本没用
</code>

你第一个设置cookie的对象都不一样啊,$curl和$curl2

贴一个我之前采集的吧

<code> if (!is_file($cookie)) {
    touch($cookie);
 }

 $this->cookieFile = $cookie;

 ...

 CURLOPT_COOKIEJAR => $this->cookieFile,
 CURLOPT_COOKIEFILE => $this->cookieFile,
</code>

贴一个我之前使用的cookie例子

<code><?php function get_data($url , $data = array()){
     $cookie_file = dirname(__FILE__).'/cookie.txt';
     $ch = curl_init();  
     curl_setopt($ch, CURLOPT_URL,$url);
     curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322)');  
     curl_setopt($ch, CURLOPT_COOKIEJAR,  $cookie_file);
     curl_setopt ( $ch, CURLOPT_FOLLOWLOCATION, 1 );
     curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0); 
     curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0); 
     if($data){
        curl_setopt ( $ch, CURLOPT_POST, 1 );
        curl_setopt ( $ch, CURLOPT_POSTFIELDS, $data );   
     }

     curl_setopt($ch, CURLOPT_SSLVERSION, 3);
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);// 设为TRUE把curl_exec()结果转化为字符串,而不是直接输出   
     $result = curl_exec($ch);
     $error=curl_error($ch);
     curl_close($ch); 
     return $result;
}
</code></code>
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn