1

外部サーバーからデータを取得するスクリプトを作成しました。サーバーがダウンした場合、サーバーがデータを待機することは望ましくありません。これは、大量のデータを処理し、サーバーが停止することを望まないためです。これに対処するために、curl 呼び出しに数百ミリ秒以上かかる場合は、それらをタイムアウトにしようとしています。

CURLOPT_TIMEOUT_MS と CURLOPT_CONNECTTIMEOUT_MS は私のバージョンの php と libcurl で利用できるはずだというドキュメントを見つけましたが、タイムアウトを 1ms に設定してもタイムアウトしていないようです。

$url = "http://www.cnn.com;

            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_HEADER,0); //Change this to a 1 to return headers
            curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_TIMEOUT_MS, 1);
            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 1);

            $data = curl_exec($ch);

            curl_close($ch);

私たちが間違っていることや、これを行う別の方法を知っている人はいますか?

4

1 に答える 1

2

応答しない DNS サーバーでこれを確認し、curl マルチ タイムアウトが機能しない:

「...情報を取得するサイトで、DNS サーバーが応答しなくなることが何度かありました。これが発生すると、curl (php バインディング) で設定されたタイムアウトが期待どおりに機能しません。1 分 14 秒後に "ホストを解決できませんでした: www.yahoo.com (ドメイン名が見つかりません)" テスト環境でこれを実現するために、/etc/resolv.conf を変更して、存在しないネームサーバー (ネームサーバー 1.1.1.1) を設定します。彼らはで設定されています

(CURLOPT_CONNECTTIMEOUT, CURLOPT_CONNECTTIMEOUT_MS 
, CURLOPT_TIMEOUT, CURLOPT_TIMEOUT_MS) 

DNS サーバーにアクセスできなくてもタイムアウトしません。同時に情報を取得する複数のソースがあるため、curl_multi を使用します。以下の例では、単純化のために 1 つの呼び出しを行います。また、エラーが発生した場合でも、curl_errno はエラー コードを返しません。理由がわからない...」

于 2009-08-14T21:12:54.340 に答える