2012-06-20 5 views
5

Я пользуюсь услугами Google GeoCoding. У меня есть приложение PHP, которое вызывает API Карт Google и получает данные JSON. Функция, вызывающая хост Google Maps, зависает до истечения времени ожидания, но только когда я нажимаю на сервер Godaddy Virtual Private.file_get_contents hangs

Я уже ssh'd на сервер и редактировать php.ini я изменил "безопасный режим" в положение "выключено"

Я получаю сообщение об ошибке:

сообщение: file_get_contents (http://maps.googleapis.com/maps/api/geocode/json?address=xYxY & датчика = ложь): не удалось открыть поток: Тайм-аут соединения

Это отлично работает на моем сервере WAMP, но не работает на реальном сервере. Любые идеи почему?

+2

Google может быть брандмауэром в реальном сервере Ur – Sergey

+1

Позвоните своему интернет-провайдеру и спросите их. Это самый простой способ. @Sergey прав, это, вероятно, проблема с брандмауэром. Многие поставщики не разрешают подобные типы соединений. – Sanjay

+0

Есть ли у вас какая-либо другая информация, если вы пытаетесь использовать 'wget' для получения страницы? Команда: 'wget http: //maps.googleapis.com/maps/api/geocode/json? Address = xYxY & sensor = false' – h2ooooooo

ответ

8

Я нашел ответ. Что случилось неделю? Я надеюсь, что другие найдут это решение. Виртуальные выделенные серверы из GoDaddy поддерживаются ipv6, но API карт google не имеет ничего подобного. Так сказать Curl, чтобы заставить запрос 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 для получения внешних данных. Многие общие серверы предотвращают использование файловых_компонентов для внешних данных (http://www.php.net/manual/en/filesystem.configuration.php#ini.allow-url-fopen) из-за рисков безопасности.

Много примеров скручивания в Интернете.

+0

началось с завитка. после часов разочарования переключились на file_get_contents. Теперь я возвращаюсь к завиту. Но проблема остается. Использование curl OR file_get_contents() Я могу загружать данные с других серверов. Я не могу назвать API Карт Google. Время процесса для максимального времени на моем виртуальном выделенном сервере (120 секунд). WOrkds мгновенно на моей локальной машине, работает мгновенно с другим тестовым URL. Просто карты Google висят. – GRY

+0

ОК - тогда мой ответ не является решением, и я скоро удалю.Это будет либо проблема межсетевого экрана/маршрутизации GoDaddy, либо google, активно блокирующая вызовы - хотя я бы подумал, что и мгновенный тайм-аут. Извините за рутину (но все же предлагаю вам остаться с завитом для будущего развития). – Robbie

+0

Спасибо, Робби, я вернулся в CuRL. Думаю, вы правы, потому что это лучший подход. – GRY

0

Проверьте свою сеть. Google не блокирует такой запрос.

Проверить here.

1

Вместо того, чтобы просто отключить IPv6, вы можете попробовать для подключения по одной IP-версии, а затем для перехода к другой, если первая попытка не удалась. Это делает вашу реализацию более надежной для временных проблем маршрутизации на вашем и удаленном конце.

Вы можете получить это поведение в file_get_contents(), связав соединение с интерфейсом с помощью inet6 или inet, а затем попробуйте другое семейство адресов, если первая попытка возвращает FAIL. Я написал how to make file_get_contents() more routing-robust and dual-stack всем, кто интересуется. Я также показываю вам, как заставить подключения использовать IPv4 или IPv6, если вы предпочитаете идти по этому маршруту.