2012-06-20 33 views
5

我正在使用Google GeoCoding服務。 我有一個PHP應用程序,它調用Google Maps API並接收JSON數據。 調用Google地圖主機的函數會掛起,直到它超時,但只有當我推送到Godaddy虛擬專用服務器時。file_get_contents掛起

我已經SSH方式登錄到服務器並修改php.ini中 我改變了「安全模式」爲「關」

我收到此錯誤信息:

消息: 的file_get_contents( http://maps.googleapis.com/maps/api/geocode/json?address=xYxY &傳感器=假): 未能打開流:連接超時

這在我的WAMP服務器中工作正常,但在現場服務器上失敗。任何想法爲什麼?

+2

谷歌可能在烏爾生活服務器防火牆 – Sergey

+1

打電話給你的ISP,並要求他們。這是最簡單的方法。 @Sergey是對的,這可能是一個防火牆問題。許多提供商不允許這些類型的連接。 – Sanjay

+0

如果您嘗試使用'wget'獲取頁面,是否還有其他信息?命令是:'wget http://maps.googleapis.com/maps/api/geocode/json?address = xYxY&sensor = false' – h2ooooooo

回答

8

我找到了答案。現在已經過了一個星期了?我希望別人找到這個解決方案。 GoDaddy的虛擬專用服務器啓用了ipv6,但谷歌地圖API沒有這個功能。所以告訴捲曲強制v4的要求,如:

curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); 

信貸是部分原因是由於一個博客,我發現這樣的信息:

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

+0

非常好,thx。 –

+1

太好了。我發現了幾個有關此問題的錯誤報告,但您是第一個真正提供解決方案的人。 – Digits

-1

使用curl獲取外部數據。由於安全風險,許多共享服務器阻止將file_get_contents用於外部數據(http://www.php.net/manual/en/filesystem.configuration.php#ini.allow-url-fopen)。

大量捲曲示例在線。

+0

以curl開頭。經過幾個小時的挫折切換到file_get_contents。現在我回到捲曲。但問題依然存在。使用curl或file_get_contents()我可以從其他服務器加載數據。我無法致電Google Maps API。虛擬專用服務器上最長時間的處理時間(120秒)。在我的本地機器上即刻運行,可以立即與其他測試網址一起運行。只是谷歌地圖掛起。 – GRY

+0

好的 - 我的回答不是解決方案 - 我馬上就會刪除。它可能是GoDaddy防火牆/路由問題,或者谷歌主動阻止呼叫 - 儘管我會想到會立即超時。對不起,燒傷轉向(但仍建議你保持捲曲爲未來的發展)。 – Robbie

+0

謝謝羅比,我已經回到CuRL我認爲你說的是​​更好的方法是正確的。 – GRY

0

檢查您的網絡。 Google不會阻止此類請求。

檢查here

1

而不是僅僅禁用IPv6,可以試試通過一個IP版本連接,如果第一次嘗試失敗,則交換到另一個IP版本。這使得您的實現可以更加健壯地處理您和遠程端的臨時路由問題。

通過將連接綁定到具有inet6或inet的接口,您可以在file_get_contents()中獲得此行爲,如果第一次嘗試返回FAIL,則嘗試其他地址系列。對於任何有興趣的人,我都寫了how to make file_get_contents() more routing-robust and dual-stack。我還向您展示瞭如何強制連接使用IPv4或IPv6,如果您願意沿着這條路線走。