file_get_contents接收cookie

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

我需要PHP做一个HTTP请求,存储的Cookie,然后使用存储的cookie进行第二个http请求。

你应该使用cURL来达到这个目的, cURL实现一个称为cookie jar的function,它允许将cookies保存在一个文件中,并将其用于后续的请求。

这里来快速代码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); 

注意 :必须注意,你应该安装pecl扩展(或以PHP编译),否则你将无法访问cURL API。

有一个神奇的variables,叫做$http_response_header ; 它是一个包含所有收到的头文件的数组。 要提取Cookie,您必须过滤以Set-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 

我意识到这是晚了,但实际上有一种方法,至less可以接收服务器发送的单个cookie。

我假设你知道如何做整个stream_create_context业务来获取你的file_get_contents http请求滚动,而你只需要协助实际设置cookie。

在url上运行file_get_contents之后,(不幸的是,非关联)数组$ http_response_header被设置。

如果服务器正在发送一个cookie,其中一个将以“Set-Cookie:”开始,你可以用substr提取。

然而,目前看来,我只能通过这个variables访问-one-Set-Cookie,这是我目前试图寻找解决方法的一个限制。

继Laereom的回答之后,下面是如何获取多个Cookie:

 $cookies=array(); foreach($http_response_header as $s){ if(preg_match('|^Set-Cookie:\s*([^=]+)=([^;]+);(.+)$|',$s,$parts)) $cookies[$parts[1]]=$parts[2]; } 

笔记:

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

你可以安装和使用HTTP的PECL扩展 ,或者确保你的php安装是用可选的curl库编译的。

我相信你用Zend_Http对象很容易做到这一点。 以下是有关将Cookie添加到请求的文档。

为了从请求中获取cookie(我相信自动检索),只需在Zend_Http对象上使用getCookieJar()

这应该很容易实现; 然而,PHP手册有一个用户评论如何使用httpstream处理cookie 。