我有两台电脑。我在两台计算机上配置了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配置,但是如果有人想检查,请使用以下网址:
http://46.7.234.111:8080/phpinfo.php
http://spicegururathgar.ie/phpinfo.php
请忽略文件名;)
我只是在尝试从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;
答案 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)。
(我必须先提一下)确保服务器上没有任何url redicects。因为如果有,file_get_contents不能遵循重定向。 (参见:curl的CURLOPT_FOLLOWLOCATION)
据我所知,你的php配置是正确的。如果您可以连接到“http://wordpress.org/plugins/about/readme.txt”页面,则问题可能来自:8080部分。我想你可以试试fsockopen。
如果所有这些都失败了,很可能是防火墙问题。
答案 7 :(得分:-1)
请参见allow_url_fopen:
http://php.net/manual/en/filesystem.configuration.php
这是为了服务器保护。在您的情况下,没有安全问题,因此可以允许。