file_get_contents卡住了

7
我正在使用谷歌地理编码服务。 我有一个调用谷歌地图API并接收JSON数据的PHP应用程序。调用谷歌地图主机的函数会挂起,直到超时,但只有当我推送到Godaddy虚拟专用服务器时才会出现这种情况。
我已经通过ssh登录到服务器并编辑了php.ini文件,将"safe mode"更改为"off"。
我收到以下错误消息:
Message: file_get_contents(http://maps.googleapis.com/maps/api/geocode/json?address=xYxY&sensor=false): failed to open stream: Connection timed out
这在我的WAMP服务器上运行良好,但在生产服务器上失败。你有什么想法吗?

2
谷歌可能被防火墙屏蔽在您的实时服务器上。 - Sergey
1
打电话给你的ISP并询问他们。这是最简单的方法。@Sergey是正确的,这很可能是防火墙问题。许多供应商不允许这些类型的连接。 - Sanjay
如果您尝试使用 wget 获取页面,是否会获得其他信息?命令是:wget http://maps.googleapis.com/maps/api/geocode/json?address=xYxY&sensor=false - h2ooooooo
4个回答

10

我找到了答案。已经有一个星期了吧?希望其他人也能找到这个解决方案。GoDaddy的虚拟专用服务器支持IPv6,但是Google Maps API并不支持。所以,要告诉Curl强制使用v4请求,就像这样:

curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 );

部分功劳归于我发现这些信息的博客:

http://www.businesscorner.co.uk/disable-ipv6-in-curl-and-php/

该博客提供了有关在CURL和PHP中禁用IPv6的信息。


2
太好了。我找到了几个关于这个问题的错误报告,但你是第一个提供解决方案的人。 - Digits

3
不要仅仅禁用IPv6,你可以尝试先连接一个IP版本,如果第一次尝试失败,则切换到另一个IP版本。这使得你的实现更加强大,能够应对你和远程端临时路由问题。
你可以通过将连接绑定到inet6或inet接口来在file_get_contents()中获得此行为,然后如果第一次尝试返回FAIL,则尝试另一个地址族。我写了一篇文章如何使file_get_contents()更具路由弹性和双栈,供有兴趣的人阅读。我还向你展示了如何强制连接使用IPv4或IPv6,如果你愿意走这条路。

-1

使用curl获取外部数据。许多共享服务器由于安全风险阻止使用file_get_contents获取外部数据(http://www.php.net/manual/en/filesystem.configuration.php#ini.allow-url-fopen)。

网上有很多curl示例。


开始使用curl。经过几个小时的挫败后,切换到了file_get_contents。现在我又回到了curl。但问题仍然存在。使用curl或file_get_contents()可以从其他服务器加载数据,但无法调用Google Maps API。在我的虚拟专用服务器上,该过程最长需要120秒的时间。在我的本地计算机上立即工作,在其他测试url上也能立即工作。只是Google地图卡住了。 - GRY
好的,我的回答似乎不是解决方案,我很快就会删除它。这可能是GoDaddy防火墙/路由问题,或者是Google主动阻止调用 - 尽管我认为两者都会立即超时。对于给您带来的困扰我感到抱歉(但仍建议您在未来的开发中继续使用curl)。 - Robbie
谢谢Robbie,我已经回到了CuRL,我认为你说得对,这是更好的方法。 - GRY

-2

请检查您的网络。Google不会阻止此类请求。

请点击这里进行检查。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接