7

Google ジオコーディング サービスを使用しています。Google Maps API を呼び出し、JSON データを受け取る PHP アプリケーションがあります。Google マップのホストを呼び出す関数がタイムアウトになるまでハングしますが、それは Godaddy Virtual Private サーバーにプッシュした場合のみです。

すでにサーバーに ssh 接続し、php.ini を編集しました。「セーフ モード」を「オフ」に変更しました。

次のエラー メッセージが表示されます。

メッセージ: file_get_contents(http://maps.googleapis.com/maps/api/geocode/json?address=xYxY&sensor=false): ストリームを開けませんでした: 接続がタイムアウトしました

これは私の WAMP サーバーでは問題なく動作しますが、ライブ サーバーでは失敗します。理由はありますか?

4

4 に答える 4

10

私は答えを見つけました。1週間経ちましたか?他の人がこの解決策を見つけてくれることを願っています。GoDaddy の仮想専用サーバーは ipv6 対応ですが、Google マップ API にはそれがありません。次のように、v4 リクエストを強制するように Curl に指示します。

curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 );

クレジットの一部は、私がこの情報を見つけたブログによるものです。

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

于 2012-06-29T04:41:23.247 に答える
3

IPv6 を無効にするだけでなく、1 つの IP バージョンで接続を試み、最初の試行が失敗した場合は別の IP バージョンに切り替えることができます。これにより、あなたとリモート エンドでの一時的なルーティングの問題に対して実装がより堅牢になります。

この動作はfile_get_contents()、inet6 または inet のいずれかを使用して接続をインターフェイスにバインドし、最初の試行で FAIL が返された場合は他のアドレス ファミリを試すことで取得できます。興味のある人のために、より堅牢なルーティングとデュアル スタックを作成する方法file_get_contents()を書きました。また、接続に IPv4 または IPv6 を使用するように強制する方法も示します。

于 2016-12-08T14:25:28.923 に答える
-1

外部データの取得には curl を使用します。多くの共有サーバーは、セキュリティ上のリスクにより、外部データ (http://www.php.net/manual/en/filesystem.configuration.php#ini.allow-url-fopen) に file_get_contents を使用することを妨げています。

たくさんのカールの例がオンラインにあります。

于 2012-06-20T07:24:11.420 に答える
-1

ネットワークを確認してください。Google はそのようなリクエストをブロックしません。

ここで確認してください。

于 2012-06-20T07:26:25.460 に答える