PHP file_get_contents不适用于localhost

时间:2011-12-07 22:17:41

标签: php localhost echo file-get-contents

我正在我的网站上从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

我该怎么办? 它在我的主机提供商服务器上运行良好。

7 个答案:

答案 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

同样,请注意使用此功能时的安全问题。

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

答案 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_contentshttps://domain.test.loc(解析为localhost的域)上不起作用,但在http://domain.test.loc上起作用。也许它不喜欢自签名证书。我确实将allow_url_fopen设置为ON,并将扩展名= php_openssl.dll。