PHP Curl 和 setcookie 问题
Posted
技术标签:
【中文标题】PHP Curl 和 setcookie 问题【英文标题】:PHP Curl and setcookie problem 【发布时间】:2011-09-21 03:41:18 【问题描述】:我有一个 curl 脚本充当客户端和主服务器之间的代理。
......
$field_array= array(
'Accept' => 'HTTP_ACCEPT',
'Accept-Charset' => 'HTTP_ACCEPT_CHARSET',
'Accept-Encoding' => 'HTTP_ACCEPT_ENCODING',
'Accept-Language' => 'HTTP_ACCEPT_LANGUAGE',
'Connection' => 'HTTP_CONNECTION',
'Host' => 'HTTP_HOST',
'Referer' => 'HTTP_REFERER',
'User-Agent' => 'HTTP_USER_AGENT'
);
$curl_request_headers=array();
foreach ($field_array as $key => $value)
if(isset($_SERVER["$value"]))
$server_value=$_SERVER["$value"];
$curl_request_headers[]="$key: $server_value";
;
$curl_request_headers[]="Expect: ";
session_write_close();
//Open connection
$curl_handle = curl_init();
curl_setopt($curl_handle,CURLOPT_COOKIE,session_name()."=".session_id().";");
//Set the url, POST data
curl_setopt($curl_handle, CURLOPT_URL, $curl_url);
curl_setopt($curl_handle, CURLOPT_POST, !empty($user_post_data));
curl_setopt($curl_handle, CURLOPT_POSTFIELDS, $user_post_data);
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl_handle, CURLOPT_AUTOREFERER, TRUE);
curl_setopt($curl_handle, CURLOPT_HEADER, 1);
curl_setopt($curl_handle, CURLOPT_FOLLOWLOCATION, false);
curl_setopt($curl_handle, CURLOPT_HTTPHEADER, $curl_request_headers);
curl_setopt($curl_handle, CURLOPT_SSL_VERIFYPEER, false);
$result = curl_exec($curl_handle);
//Close connection
curl_close($curl_handle);
list($headers,$content)=explode("\r\n\r\n",$result,2);
foreach (explode("\r\n",$headers) as $hdr)
if(preg_match("/Transfer-Encoding:.*chunked/i", $hdr))
// Remove chunked headers. Not properly handled by browsers
else
header($hdr);
;
echo $content;
现在,在主服务器上,我在脚本中设置了一个 cookie,然后尝试在另一个脚本中读取它的值。我无法读取该值。所以在 curl 中传递值存在一些问题。如何解决?
谢谢
找到解决方案:
实际上,一个愚蠢的问题。我需要在 CURLOPT_COOKIE 中明确设置 cookie。以下代码现在适用于我:
......
$_COOKIE[session_name()]=session_id();
$cookie_string="";
foreach( $_COOKIE as $key => $value )
$cookie_string .= "$key=$value;";
;
//Open connection
$curl_handle = curl_init();
curl_setopt($curl_handle,CURLOPT_COOKIE, $cookie_string);
......
【问题讨论】:
我认为你应该使用 COOKIEJAR 和 COOKIEFILE 函数。 可以将自己的问题作为答案来回答,而不是在问题中 @Jon:谢谢...在接下来的 8 小时内我无法回答... 现在你可以发布你的答案并接受它 【参考方案1】:考虑http_build_cookie() 而不是内爆cookie 字符串,或者,如果您没有安装pecl_http:
http_build_query($cookies, null, ';')
很简单。
【讨论】:
【参考方案2】:你必须在分号后添加空格,所以最好的方法是:
$cookie = array();
foreach( $_COOKIE as $key => $value )
$cookie[] = "$key=$value";
;
$cookie = implode('; ', $cookie);
$curl_handle = curl_init();
curl_setopt($curl_handle, CURLOPT_COOKIE, $cookie);
【讨论】:
+1 - 我必须rawurlencode()
值,因为我的一些值有分号。 $cookie[] = $key ."=". rawurlencode($value);
考虑使用http_build_query($cookies, null, ';')
而不是foreach。以上是关于PHP Curl 和 setcookie 问题的主要内容,如果未能解决你的问题,请参考以下文章
PHP:setcookie() 和 unset() 不删除 cookie
PHP 中内置函数 setcookie() 和 setrawcookie() 的实际实际差异是啥?