2012-06-20 6 views
5

J'utilise les services Google GeoCoding. J'ai une application PHP qui appelle l'API Google Maps et qui reçoit des données JSON. La fonction qui appelle l'hôte Google Maps se bloque jusqu'à ce qu'elle expire, mais uniquement lorsque j'appuie sur le serveur Godaddy Virtual Private.file_get_contents se bloque

Je l'ai déjà ssh'd dans le serveur et php.ini édité j'ai changé "safe mode" à "off"

Je reçois ce message d'erreur:

message: file_get_contents (http://maps.googleapis.com/maps/api/geocode/json?address=xYxY capteur & = false): failed to open stream: Délai de connexion dépassé

Cette fonctionne bien dans mon serveur WAMP, mais échoue sur le serveur en direct. Des idées pourquoi?

+2

Google peut être pare-feu dans Ur serveur en direct – Sergey

+1

Appelez votre fournisseur de services Internet et leur demander. C'est le moyen le plus facile. @Sergey a raison, il s'agit probablement d'un problème de pare-feu. De nombreux fournisseurs n'autorisent pas ce type de connexion. – Sanjay

+0

Avez-vous d'autres informations si vous essayez d'utiliser 'wget' pour obtenir la page? La commande est: 'wget http: //maps.googleapis.com/maps/api/geocode/json? Address = xYxY & sensor = false' – h2ooooooo

Répondre

8

J'ai trouvé la réponse. Qu'est-ce qui a duré une semaine, maintenant? J'espère que les autres trouveront cette solution. Les serveurs dédiés virtuels de GoDaddy sont compatibles avec ipv6, mais l'API google maps n'en a aucune. Alors, dites Curl pour forcer la demande v4, comme ceci:

curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); 

crédit est due en partie à un blog où j'ai trouvé ces informations:

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

+0

Très bien, merci. –

+1

Merveilleux. J'ai trouvé plusieurs rapports de bogues concernant ce problème, mais vous êtes le premier à donner une solution. – Digits

-1

Utilisez la boucle pour obtenir des données externes. De nombreux serveurs partagés empêchent l'utilisation de file_get_contents pour les données externes (http://www.php.net/manual/fr/filesystem.configuration.php#ini.allow-url-fopen) en raison des risques de sécurité.

De nombreux exemples de boucles en ligne.

+0

commencé avec curl. après des heures de frustration passées à file_get_contents. Maintenant je suis de retour pour boucler. Mais le problème reste. En utilisant curl OU file_get_contents() je peux charger des données d'autres serveurs. Je ne peux pas appeler l'API Google Maps. Les temps de traitement pour le temps maximum sur mon serveur dédié virtuel (120 secondes). Crée instantanément sur ma machine locale, fonctionne instantanément avec une autre URL de test. Juste Google cartes se bloque. – GRY

+0

OK - ma réponse n'est pas la solution alors - et je vais supprimer rapidement.Il s'agira soit d'un problème de pare-feu/routage GoDaddy, soit d'un blocage actif des appels par google - bien que j'aurais pensé que les deux seraient instantanément temporisés. Désolé pour le bum steer (mais toujours vous suggérons de rester avec curl pour le développement futur). – Robbie

+0

Merci Robbie, je suis revenu à CuRL Je pense que vous avez raison de dire que c'est la meilleure approche. – GRY

0

Vérifiez votre réseau. Google ne bloque pas une telle demande.

Vérifiez here.

1

Plutôt que de désactiver IPv6, vous pouvez essayer se connecter sur une version IP, puis passer à l'autre si la première tentative échoue. Cela rend votre implémentation plus robuste aux problèmes de routage temporaires sur votre et l'extrémité distante.

Vous pouvez obtenir ce comportement dans file_get_contents() en liant la connexion à une interface avec inet6 ou inet, puis essayez l'autre famille d'adresses si la première tentative renvoie FAIL. J'ai écrit how to make file_get_contents() more routing-robust and dual-stack pour tous ceux qui sont intéressés. Je vous montre également comment forcer les connexions à utiliser IPv4 ou IPv6 si vous préférez emprunter cette route.