我正在尝试使用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
最后是为什么不file_get_contents
工作?Wiki的答案几乎涵盖了所有可能出错的问题以及如何处理
确保在php.ini中将allow_url_fopen设置为on
您应该通过查看PHP ini设置allow_url_fopen
编辑:你可以用这段代码检查是否启用
echo php_ini_get('allow_url_fopen') ? 'Enabled' : 'Disabled';
如果你做的一切都是正确的,仍然没有成功!你正在使用Redhat或CentOs…然后试试这个命令
setsebool -P httpd_can_network_connect on
一些RedHat和CentOs安装阻止httpd向外部服务器发送请求。