3

私たちのサイトには、cURL を使用してリモート ドメインから XML データを取得するページがあります。数日前、ランダムに失敗し始めました (おそらくリクエストの 1/3 が失敗します)。私たちのホストとリモート サイトのオペレーターでデバッグした後、curl エラーは「name lookup timed out」であり、DNS の問題を示していることがわかりました。私たちCURLOPT_CONNECTTIMEOUTは 5 に設定されていました。それを 30 に変更すると、毎回機能しました。

しかし、これはライブ ページです。応答を待っている間、訪問者を 30 秒間ハングさせることはできません。さらに、タイムアウトの増加は、そもそもなぜこれが失敗し始めたのかという質問には答えません。このシステムは何年も前から導入されており、5 秒のタイムアウトは常に問題ありませんでした。

dns_get_record()さらに、 を実行すると、毎回機能し、有効な IP アドレスをすぐに取得できることがわかりました。そこで、最初に を実行するようにスクリプトを変更しdns_get_record()、次に、返された IP に cURL を送信します。これにより、cURL の最後で名前検索が回避されます。それはうまくいきますが、ばかげています。

最初の質問ですが、cURL がどのように、またはなぜ失敗するかについて、何か提案はありますか。私たちのホストとリモート サイトのホストはどちらも、それがどこかにある DNS サーバーであることに同意しますが、どちらの DNS サーバーが責任を負っているかについては同意しません。

2 番目の質問は、 + cURLfile_get_contents()の十分な代替品ですか? dns_get_record()または、dns_get_record()代わりに + cURL を使用する必要がありますか?

4

1 に答える 1

2

内部では、 と の両方がほぼ同じ操作curl_execを実行します。file_get_contentsどちらも次のように使用libresolvします。

  1. ネームサーバーに接続する
  2. DNSリクエストを発行する
  3. DNS 応答を処理する

これをさらにデバッグするには、 を使用curl_getinfo()してリクエストに関する詳細な統計を取得できます。これを使用して、次を使用して各部分にかかった時間を把握できます。

  • CURLINFO_NAMELOOKUP_TIME
  • CURLINFO_CONNECT_TIME
  • CURLINFO_PRETRANSFER_TIME
  • ...
于 2012-06-22T02:10:16.233 に答える