ホームページ >バックエンド開発 >PHPチュートリアル >PHPCurl のミリ秒タイムアウトの「バグ」_PHP チュートリアル
最近、私たちのサービスは PHP で使用される libcurl をアップグレードしています。新しいバージョンの libcurl はミリ秒のタイムアウトをサポートし、バックエンド インターフェイスのタイムアウトをより正確に制御できるようになり、全体的な応答時間が向上することが期待されています。
ただし、CentOS サーバーでは、タイムアウトを 1000 ミリ秒未満に設定すると、curl はリクエストを開始せず、直接タイムアウト エラー (タイムアウトが 28 に達しました) を返すことがわかりました。
ここに落とし穴があることがわかりました。Linux システムでは、システム標準の DNS 解決が使用される場合、SIGALARM がドメイン名解決のタイムアウトを制御する機能を使用します。ただし、SIGALARM はタイムアウトをサポートしません。 1 秒未満なので、libcurl 7.28.1 のコード内 (中国語のコメント行に注意してください):
int Curl_resolv_timeout(struct connectdata *conn,タイムアウトが 1000 ミリ秒未満の場合、名前分析は直接 CURLRESOLV_TIMEOUT を返し、最終的には CURLE_OPERATION_TIMEDOUT につながり、その後エラー、タイムアウトに達しました...
が表示されることがわかります。これは不正すぎませんか? ミリ秒タイムアウトを使用できないのですか? では、なぜこの機能を提供するのでしょうか?
もう一度コードを見てみましょう。先ほどと同じコードです。ここ (中国語のコメント行) に注目してください:リーリー
これは簡単です。コードを grep して見つけます:
リーリー
リーリー
追記:
このように、DNS 解決にはタイムアウト制限が適用されないという潜在的な危険が存在します。これは社内では通常問題になりませんが、DNS サーバーがハングするとアプリケーションのタイムアウトが発生する可能性があります。
それで、他に方法はありますか?はい、Mike が思い出させてくれたように、名前解決に libcurl に c-ares (非同期 DNS リクエスト用の C ライブラリ) を使用させることができます。具体的には、curl を設定できます。 リーリー
./configure --enable-ares[=PATH]
PS、なぜこれが「バグ」と呼ばれるのですか? ちょっと興味があるのですが、なぜ setitimer を使用しないのですか?
参照: http://stackoverflow.com/questions/7987584/curl-timeout-less-than-1000ms-always-fails
作者: ラルーエンス
この記事のURL:http://www.laruence.com/2014/01/21/2939.html
http://www.bkjia.com/PHPjc/735044.html