在执行file_get_contents
请求时,是否可以接收远程服务器设置的cookie?
我需要php来执行http请求,存储cookie,然后使用存储的cookie发出第二个http请求。
答案 0 :(得分:25)
这有一个神奇的变量,称为$http_response_header
;它是一个包含所有收到的标题的数组。要提取Cookie,您必须过滤掉以Set-Cookie:
开头的标题。
file_get_contents('http://example.org');
$cookies = array();
foreach ($http_response_header as $hdr) {
if (preg_match('/^Set-Cookie:\s*([^;]+)/', $hdr, $matches)) {
parse_str($matches[1], $tmp);
$cookies += $tmp;
}
}
print_r($cookies);
一种等效但不太神奇的方法是使用stream_get_meta_data()
:
if (false !== ($f = fopen('http://www.example.org', 'r'))) {
$meta = stream_get_meta_data($f);
$headers = $meta['wrapper_data'];
$contents = stream_get_contents($f);
fclose($f);
}
// $headers now contains the same array as $http_response_header
答案 1 :(得分:21)
为了这个目的,您应该使用cURL
,cURL
实现一个名为cookie jar的功能,该功能允许将cookie保存在文件中并将其重用于后续请求。
这里有一个快速的代码snipet怎么做:
/* STEP 1. let’s create a cookie file */
$ckfile = tempnam ("/tmp", "CURLCOOKIE");
/* STEP 2. visit the homepage to set the cookie properly */
$ch = curl_init ("http://somedomain.com/");
curl_setopt ($ch, CURLOPT_COOKIEJAR, $ckfile);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec ($ch);
/* STEP 3. visit cookiepage.php */
$ch = curl_init ("http://somedomain.com/cookiepage.php");
curl_setopt ($ch, CURLOPT_COOKIEFILE, $ckfile);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec ($ch);
note :必须注意你应该安装pecl扩展(或用PHP编译),否则你将无法访问cURL API。
答案 2 :(得分:14)
我意识到这是迟到的,但实际上有一种方法可以至少接收服务器发送的个别cookie。
我假设您知道如何执行整个stream_create_context业务以使您的file_get_contents http请求滚动,您只需要帮助实际设置Cookie。
在网址上运行file_get_contents后,设置了(不幸的是,非关联的)数组$ http_response_header。
如果服务器正在发回cookie,其中一个将以“Set-Cookie:”开头,您可以使用substr进行提取。
但是,目前在我看来,只能通过此变量访问-one-Set-Cookie,这是我目前正试图找到一种解决方法的限制。
答案 3 :(得分:7)
根据Laereom的回答,以下是如何获取多个cookie:
$cookies=array();
foreach($http_response_header as $s){
if(preg_match('|^Set-Cookie:\s*([^=]+)=([^;]+);(.+)$|',$s,$parts))
$cookies[$parts[1]]=$parts[2];
}
注意:
explode(';',$parts[3])
然后另一个循环来处理它(因为我不确定这些属性是否有固定的顺序。答案 4 :(得分:2)
您可以安装和使用PECL extension for HTTP,也可以确保使用可选的curl library编译您的php安装。
答案 5 :(得分:1)
我相信你可以使用Zend_Http对象很容易地做到这一点。以下是有关请求adding cookies的文档。
要从请求中获取cookie(我相信会自动检索),只需在Zend_Http对象上使用getCookieJar()
。
这应该易于实施;但是,php手册在how to deal with cookies using the http stream上有用户评论。