我正在我的网站上从localhost(http://172.16.65.1/)在OSX上运行MAMP服务器。
我想从谷歌加载一些JSON,一些简单的测试告诉我这里有一个问题..
echo file_get_contents("http://www.google.com"); // FAILS
// PHP log: [07-Dec-2011 23:09:21] PHP Warning: file_get_contents(http://www.google.com) [<a href='function.file-get-contents'>function.file-get-contents</a>]: failed to open stream: Host is down in /Applications/MAMP/htdocs/-tests/get-json.php on line 3
echo file_get_contents("http://www.yahoo.com"); // FAILS
// echo file_get_contents("http://localhost"); // WORKS
// echo file_get_contents("http://172.16.65.1/"); // WORKS - My MAMP server
我该怎么办? 它在我的主机提供商服务器上运行良好。
答案 0 :(得分:11)
您还需要签入PHP.ini
文件
extension = php_openssl.dll
是否启用,如果没有,则通过删除启用;登录
allow_url_fopen = on
答案 1 :(得分:5)
来自file_get_contents
的文档:
如果已启用fopen包装,则可以使用此函数将URL用作文件名。有关如何指定文件名的更多详细信息,请参阅fopen()。有关各种包装器具有哪些功能的信息,使用说明以及它们可能提供的任何预定义变量的信息,请参阅支持的协议和包装器。
检入php.ini
,以便将allow_url_fopen
设置为on
。
<强> 编辑: 强>
我没有注意到你实际上可以在本地使用file_get_contents
,所以现在我认为这可能与你的firewall settings
有关。
另外,如果尚未设置user_agent
,请尝试设置php.ini
。
答案 2 :(得分:3)
这可能是php.ini文件中的一个设置。 allow_url_fopen有一个设置,可以启用/禁用从php打开远程文件的功能。出于安全原因,这通常默认为禁用。您可以通过添加以下行在php.ini中启用它:
allow_url_fopen = 1
同样,请注意使用此功能时的安全问题。
答案 3 :(得分:3)
尝试使用此函数代替file_get_contents():
<?php
function curl_get_contents($url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
它可以像file_get_contents()一样使用,但使用cURL。
在Ubuntu(或其他具有aptitude的类Unix操作系统)上安装cURL:
sudo apt-get install php5-curl
sudo /etc/init.d/apache2 restart
另见cURL
答案 4 :(得分:1)
在第二个中,您尝试在当前文件夹中打开名为localhost的文件,该文件不存在,因此会引发错误。请改用http://localhost。要做到这一点,你必须设置allow_furl_open。
答案 5 :(得分:0)
我这样使用 file_get_contents : 的file_get_contents( “https://api.twitter.com/1/statuses/user_timeline.json?include_entities=true&include_rts=true&screen_name=” $屏幕名。 “&安培;计数= 5”);
这不起作用,所以我将https更改为http,之后它运行良好。
file_get_contents("http://api.twitter.com/1/statuses/user_timeline.json?include_entities=true&include_rts=true&screen_name=".$screenname."&count=5");
答案 6 :(得分:0)
对我来说,问题是file_get_contents
在https://domain.test.loc(解析为localhost的域)上不起作用,但在http://domain.test.loc上起作用。也许它不喜欢自签名证书。我确实将allow_url_fopen
设置为ON,并将扩展名= php_openssl.dll。