file_get_contents接收cookie

时间:2009-11-25 15:01:38

标签: php cookies

在执行file_get_contents请求时,是否可以接收远程服务器设置的cookie?

我需要php来执行http请求,存储cookie,然后使用存储的cookie发出第二个http请求。

6 个答案:

答案 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)

为了这个目的,您应该使用cURLcURL实现一个名为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];
    }

注意:

  1. 我对正则表达式很自由;研究RFC,如果你想更精确(即拒绝形成错误的cookie数据)
  2. 你会在$ parts [3]中找到path =,expires =等。我建议explode(';',$parts[3])然后另一个循环来处理它(因为我不确定这些属性是否有固定的顺序。
  3. 如果两个cookie具有相同的名称部分,则只有最后一个存活,这似乎是正确的。 (我碰巧在我当前的项目中出现这种情况;我认为这是网站上的一个错误,我正在进行屏幕抓取。)

答案 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上有用户评论。