问题在获取内容/文件使用file_get_contents从url或问题在反向地理编码


Problem in getting contents/ files using file_get_contents from url or Problem in reverse geo coding

我正在尝试使用php脚本中的谷歌api(使用xmlrpc)反向地理代码。我在本地系统中编写了以下代码,它工作正常,但当我在我们的web服务器中尝试时,它失败了。

function reverseGeoCode()
{
    $url = "http://maps.google.com/maps/geo?json&ll=".$lat.",".$long;
    $data = file_get_contents(urlencode($url));
    if ($data == FALSE)
    {
        echo "failed";
    }
    else
    {
        echo "success";
        // parsing the json/xml ...
    }
}

我得到了0/p "failed"

我的本地php: php5.3.6和浏览器是5.2.9。由于它连续失败,我将url更改为http://www.google.com进行测试(不使用urlencode),然后在web服务器中也失败了。如果有人有想法来纠正我的错误,请帮助。提前感谢

URL看起来已经正确地进行了URL编码,所以不要再次进行URL编码,否则会导致URL在您的情况下不起作用。这就是你得到FALSE返回值的原因。关于返回值的含义,请参见file_get_contents Docs

直接获取URL:

$data = file_get_contents($url);

如果不工作,只urlencode查询参数:

$url = sprintf("http://maps.google.com/maps/geo?json&ll=%s,%s", 
                urlencode($lat), urlencode($long));

参见url_encode Docs和统一资源标识符(RFC 2616 Section 3.2)以及统一资源标识符(URI):通用语法(RFC 2396)。


如果您想了解更多请求失败的原因,您可以通过允许file_get_contents继续HTTP失败来获得更多信息(请参阅此答案如何在4xx响应上返回文档),如果您使用的URL已经正确并且您想了解更多关于服务器告诉您的内容,这可能很有用。

接下来,您可以通过获取URL的标头或使用$http_response_header Docs

来检查响应HTTP状态码。

最后是为什么不file_get_contents工作?Wiki的答案几乎涵盖了所有可能出错的问题以及如何处理

确保在php.ini中将allow_url_fopen设置为on

您应该通过查看PHP ini设置allow_url_fopen

的值来检查服务器上是否启用了"URL包装器"

编辑:你可以用这段代码检查是否启用

echo php_ini_get('allow_url_fopen') ? 'Enabled' : 'Disabled';

如果你做的一切都是正确的,仍然没有成功!你正在使用Redhat或CentOs…然后试试这个命令

setsebool -P httpd_can_network_connect on

一些RedHat和CentOs安装阻止httpd向外部服务器发送请求。