file_get_contents没有按预期工作但curl工作正常。

时间:2014-02-04 14:12:52

标签: php curl file-get-contents

我已经在我的服务器上测试了file_get_contents,它适用于几乎所有网站,并且对于以下特定链接失败,但适用于http://phpfiddle.org/

<?php

$homepage = file_get_contents('http://www.kinopoisk.ru/picture/10006/');
echo $homepage;

?>

我测试了这个链接http://www.kinopoisk.ru,它也适用于我的服务器,我检查了日志,没有该链接的日志。由于主页非常明确地表明在两个站点(我的站点和该站点)都没有禁用file_get_contents,因此如果有人能够找出问题,为什么它在我的页面中不起作用,那就太棒了。 我也尝试了卷曲和相同的空白输出。没有错误。

<?php

$curl_handle=curl_init();
curl_setopt($curl_handle, CURLOPT_URL,'http://www.kinopoisk.ru/picture/10006/');
curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 2);
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl_handle, CURLOPT_USERAGENT, 'Your application name');
$query = curl_exec($curl_handle);
curl_close($curl_handle);

?>

2 个答案:

答案 0 :(得分:1)

我查看了两个代码段。

在您的代码使用curl的代码段中,HTTP请求标头如下所示。

GET /picture/10006/ HTTP/1.1
User-Agent: Your application name
Host: www.kinopoisk.ru
Accept: */*

在代码使用file_get_contents的代码段中,HTTP Request标头如下所示。

GET /picture/10006/ HTTP/1.0
Host: www.kinopoisk.ru

这说明如果未设置User-Agent和Accept-Header,www.kinopoisk.ru上的网络服务器没有响应。我将您的第一个代码示例更改为以下内容,现在可以使用了。

$opts = array(
    'http'=>array(
    'method'=>"GET",
    'header'=>"Accept: */*i\r\n" .
              "User-Agent: Your application name\r\n"
));
$context = stream_context_create($opts);
$homepage = file_get_contents('http://www.kinopoisk.ru/picture/10006/',0, $context);
print_r($homepage);

通过查看响应标头,我可以看到www.kinopoisk.ru上的服务器正在使用Nginx,并且很可能配置为在未设置Accept和User-Agent标头时不返回响应。

答案 1 :(得分:0)

使用curl解决但我仍然不知道为什么file_get_contents在一台服务器上工作而不在其他服务器上工作

<?php

$curl_handle=curl_init();
 curl_setopt($curl_handle, CURLOPT_URL,'http://www.kinopoisk.ru/picture/10006/');
   curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 2);
 curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($curl_handle, CURLOPT_USERAGENT, 'Your application name');
  $query = curl_exec($curl_handle);
  curl_close($curl_handle);


 echo $query;
  ?>