使用file_get_contents()时出现问题

时间:2013-12-27 08:01:37

标签: php

我有两台电脑。我在两台计算机上配置了Web服务器,两者都正常工作。现在我想使用file_get_contents()从第二个访问第一个网址。

第一个网址:

http://46.7.234.111:8080/server/test_curl.php

第二个网址:

http://spicegururathgar.ie/client/test_curl.php

访问第一个网址的代码:

$url = "http://46.7.234.111:8080/server/test_curl.php";
$url = 'http://' . str_replace('http://', '', $url); // Avoid accessing the file system
$opts = array('http' => array('header' => "User-Agent:MyAgent/1.0\r\n"));
$context = stream_context_create($opts);
$header = file_get_contents('$url', false, $context); // Not working
//$header = file_get_contents('http://wordpress.org/plugins/about/readme.txt', false, $context); // Working Fine

Apache错误日志:

[27-Dec-2013 08:31:12 UTC] PHP Warning:  file_get_contents(http://46.7.234.111:8080/server/test_curl.php) [<a href='function.file-get-contents'>function.file-get-contents</a>]: failed to open stream: Connection timed out in /home/spicegur/public_html/client/test_curl.php on line 6

我可以使用file_get_contents()访问其他文件,但不能访问我想要的文件。所以请帮我解决这个问题。

我检查了两台服务器上的所有PHP配置,但是如果有人想检查,请使用以下网址:

  1. http://46.7.234.111:8080/phpinfo.php
  2. http://spicegururathgar.ie/phpinfo.php
  3. 请忽略文件名;)

    我只是在尝试从spicegururathgar.ie服务器运行代码时遇到此问题,有人知道为什么会这样吗?

    替代尝试

    我也尝试过使用PHP CURL,但我仍然遇到同样的错误。这是我的PHP CURL代码。此代码正在我的localhost上运行,但不在我的服务器上。请帮帮我。

    $runfile = "http://46.7.234.111:8080/server/test_curl.php";
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $runfile);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL,$runfile);
    $content = curl_exec($ch);
    curl_close($ch); 
    echo $content;
    

8 个答案:

答案 0 :(得分:9)

$header = file_get_contents('$url',false,$context);//Not working

应该是

$header = file_get_contents($url,false,$context);//Not working

不需要报价。此外,变量aren't expanded within single quotes。如果这确实是您拥有的代码,我无法解释它在任何一台服务器上如何使用任何文件。

答案 1 :(得分:4)

您的PHP代码是正确的,除了$url周围的单引号,但由于Apache日志包含真实的URL,我想这只是问题文本中的拼写错误。

问题是spicegururathgar.ie服务器加载test_curl.php需要花费太多时间,所以基本上你会超时。我已经尝试使用浏览器等待几分钟而test_curl.php未提供服务,因此spicegururathgar.ie服务器似乎存在问题。

如果预计它需要几分钟才能响应,您可以提高请求时间值:

$opts = array('http' => array(
  'header' => "User-Agent:MyAgent/1.0\r\n",
  'timeout' => 60*5 // 5 minutes
));

答案 2 :(得分:2)

第6行的$url变量应该用双引号括起来,或者根本不包含任何内容:

$header = file_get_contents("$url", false, $context);

$header = file_get_contents($url, false, $context);

答案 3 :(得分:2)

我会建议cUrl,我遇到了与file_get_contents相同的问题,直到有人告诉我cUrl。这是一个基本但有效的功能。

function curl_get_contents($url)
{   
  $ch = curl_init($url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
  curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
  $data = curl_exec($ch);
  curl_close($ch);
  return $data;
}

答案 4 :(得分:1)

您应该在shell上的spicegururathgar.ie服务器上尝试wget http://46.7.234.111:8080/phpinfo.php。有可能,服务器上的防火墙阻止了端口8080或80,433等以外的端口的通信。

更简单的测试是尝试在端口80上加载文件。

对我而言,这看起来像是防火墙问题。

答案 5 :(得分:1)

我还会启动Fiddler来验证您的网络浏览器正在向服务器发送的内容。一些服务器被配置为忽略来自非标准Web浏览器的请求,因为它们为每种类型的浏览器大大地定制了它们的输出(这可能会减少他们潜在的用户群)。

答案 6 :(得分:1)

我刚刚在我的本地服务器上尝试了你的代码,它运行正常。这意味着服务器(46.7.234.111:8080/server/test_curl.php)没有问题。所以让我们关注客户端(spicegururathgar.ie/client/test_curl.php)。

  1. (我必须先提一下)确保服务器上没有任何url redicects。因为如果有,file_get_contents不能遵循重定向。 (参见:curl的CURLOPT_FOLLOWLOCATION)

  2. 据我所知,你的php配置是正确的。如果您可以连接到“http://wordpress.org/plugins/about/readme.txt”页面,则问题可能来自:8080部分。我想你可以试试fsockopen。

  3. 如果所有这些都失败了,很可能是防火墙问题。

答案 7 :(得分:-1)

请参见allow_url_fopen:

http://php.net/manual/en/filesystem.configuration.php

这是为了服务器保护。在您的情况下,没有安全问题,因此可以允许。