2017-01-12 4 views
0

PHP curl_multi()を使用してウェブサイトをクロールしています。ここで説明したLibcurlの同期DNSの問題(https://stackoverflow.com/a/2315290/4391251)により、URLの1つが解決されなかった場合、バッチ全体の処理が 'カールエラー:6:ホスト名:名前ルックアップタイムアウト'を解決できませんでした時間内のDNS。残念ながら、私はDNS要求を非同期にするためにLibcurlをc-aresでコンパイルできません。Curl PHP偽のエラー6:名前の検索にタイムアウトが発生しました

  1. この問題を解決する他の方法はありますか?たぶんタイムアウトしたDNS解決が次のDNS要求をタイムアウトさせるのを防ぐために使用できるエキゾチックなPHPタイムアウトですか?

  2. もし存在しなければ、DNSを解決しないURLをどのように偽装/エミュレートできますか?今私は一度に大きなバッチのURLを実行しているので、ソリューションをテストできるように解決できないことを願っています.DNSキャッシュのために明らかに/明らかにうまく動作しません。

  3. この問題を解決/最小化するには、CURLOPT_CONNECTTIMEOUT、CURLOPT_DNS_CACHE_TIMEOUT、またはCURLOPT_IPRESOLVEなどの設定を使用できますか?これまでのところ、どちらも私にとっては何の効果もないようです。

ありがとうございます!

+0

#Location_in_the_file_system – hanshenrik

答えて

2

まず、あなたがリンクしている古い回答は部分的に正しいだけです。 (私はlibcurlの主著者であり、ここで話しているほとんどのコードを書いています)。

第2に、Linuxディストリビューションとウィンドウ上のほとんどのlibcurlsはスレッドリゾルバでビルドされています。うまく解決する。

しかし、実際の質問に答えるには、ホスト名を使用しないでDNSを完全に解決することを避けることができます。 IPアドレスは直接使用してください。これらのIPアドレスには、使用するホスト名のためにCURLOPT_RESOLVEを指定できます。それは良く見えませんが、うまくいくはずです。 https://en.wikipedia.org/wiki/Hosts_(file) - あなただけのそれはタイムアウトが発生するにはあまりにも速く、ミリ秒以下で解決する必要があり、それをクロールする前にhostsファイルにウェブサイトを追加することができます

+0

あなたは本当にCURLOPT_IPRESOLVEですか?多分あなたはCURLOPT_CONNECT_TOを意味しましたか? – hanshenrik

+0

私はこの問題も抱えています.. Macにスレッドリゾルバがないのですか? – Wesley

+0

@Wesley:あなたがそれをそのように構築すれば(Apple船が行うバージョン) –

関連する問題