【问题标题】:PHP file_get_contents does not work on localhostPHP file_get_contents 在本地主机上不起作用
【发布时间】:2012-01-15 10:36:08
【问题描述】:

我正在从 OSX 上的 MAMP 服务器本地主机 (http://172.16.65.1/) 处理我的网站。
我想从 Google 加载一些 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

对此我能做些什么? 它在我的主机提供商服务器上运行良好。

【问题讨论】:

  • 您使用的是哪个版本的 MAMP?
  • Google 可能会拒绝通过 file_get_contents b/c 的请求,因为尚未定义适当的用户代理,您可能必须使用 curl; us3.php.net/curl
  • @Digital Precision 与 Curl 有同样的问题。与 Google 无关,因为任何 URL 都不会返回任何内容。我敢打赌这是我的 ISP。
  • @FFish:参考其他解决方案之一,并确保 allow_url_fopen 为 true。
  • @FFish - 您可以尝试将file_get_contents 与某个网站的数字 IP 地址一起使用,看看是否可行?

标签: php localhost echo file-get-contents


【解决方案1】:

来自file_get_contents 的文档:

如果启用了 fopen 包装器,则 URL 可以用作此函数的文件名。有关如何指定文件名的更多详细信息,请参阅 fopen()。请参阅支持的协议和包装器以获取有关各种包装器具有哪些功能的信息的链接、有关它们的使用说明以及它们可能提供的任何预定义变量的信息。

签入您的php.ini,因此allow_url_fopen 设置为on

编辑:

我没有注意到您实际上可以在本地使用file_get_contents,所以现在我认为这可能与您的firewall settings 有关。

另外,如果尚未完成,请尝试在您的 php.ini 中设置 user_agent

【讨论】:

  • 您确定您正在查看的是正确的php.ini 文件吗?如果没有尝试运行 phpInfo() 以查看 php.ini 被加载。
  • 是的,它是正确的 php.ini 文件,并且已经准备就绪。我也尝试使用我的移动互联网连接(其他 ISP)也不行..“无法打开流:主机已关闭”为什么主机已关闭??
  • 该死的,我刚刚尝试了你的最后一个提示。禁用 Little Snitch,我的防火墙。现在它可以工作了:-)) 非常感谢!
  • 好吧,就像我为httpd 设置的规则以拒绝任何连接一样。不知道我为什么这样做,因为我什至不知道 httpd 实际上是什么。可能是来自我的防火墙的弹出窗口,在那里我和我杀死了它。顺便说一句,Curl 现在也可以工作了,Zuper :-)
  • 您能否更具体地了解您设置为“拒绝”@FFish 的 httpd 配置设置?路径和具体设置名称是什么:我正在检查我没有相同的
【解决方案2】:

在第二个中,您尝试在当前文件夹中打开一个名为 localhost 的文件,该文件不存在,因此会引发错误。请改用http://localhost。为了让它工作,你必须设置allow_furl_open。

【讨论】:

    【解决方案3】:

    这可能是您的 php.ini 文件中的设置。 allow_url_fopen 有一个设置,它启用/禁用从 php 打开远程文件的能力。出于安全原因,这通常默认为禁用。您可以通过添加以下行在 php.ini 中启用它:

    allow_url_fopen = 1
    

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

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

    【讨论】:

    • 在 /Applications/MAMP/conf/php5.3/php.ini allow_url_fopen = On 没有 :-(
    【解决方案4】:

    我是这样使用 file_get_contents 的: file_get_contents("https://api.twitter.com/1/statuses/user_timeline.json?include_entities=true&include_rts=true&screen_name=".$screenname."&count=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");
    

    【讨论】:

    • rawurlencodefile_get_contents 中使用查询字符串 ($_GET[]) 时应使用
    【解决方案5】:

    您还需要签入PHP.ini 文件

    extension = php_openssl.dll
    

    是否启用,如果没有,则只需通过删除 ;签到

    allow_url_fopen = on
    

    【讨论】:

    • @Wolfeh 是的。这个答案应该更高!没错,它更高!因为它实际上解决了 cURL 的空响应,即使在 SO!!!
    • 我有这些,但它仍然不适用于 https 网址。如果我在真实服务器上而不是从本地主机上运行 php,它确实有效。
    【解决方案6】:

    试试这个函数代替 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

    【讨论】:

      【解决方案7】:

      对我来说,问题是 file_get_contents 不适用于 https://domain.test.loc(解析为 localhost 的域),但适用于 http://domain.test.loc。也许它不喜欢自签名证书。我确实将 allow_url_fopen 设置为 ON 并且 extension = php_openssl.dll。

      【讨论】:

      • 我不确定这如何回答这个问题。
      • 它告诉我这是在本地主机上使用 https 的问题。它可能对其他人有用。
      • 问题是关于从本地主机到其他地方的连接,而不是从本地主机到本地主机。
      • 我不是要辩护,但是这个标题有问题:“PHP file_get_contents 在 localhost 上不起作用” - 这个世界上的 localhost 到底是什么。基本上代码在本地主机上工作。如果您使用的是开发机器或服务器,则代码在其上运行(本地主机)。
      • localhost 大多数人的意思是指未经特殊配置的服务器,很可能无法从 Internet 访问。
      猜你喜欢
      • 2011-07-31
      • 2012-01-15
      • 1970-01-01
      • 1970-01-01
      • 2018-05-20
      • 2015-02-25
      • 2011-02-15
      • 2015-03-19
      • 2018-01-02
      相关资源
      最近更新 更多