ホームページ  >  記事  >  バックエンド開発  >  PHP CURLのタイムアウトを設定する方法

PHP CURLのタイムアウトを設定する方法

藏色散人
藏色散人オリジナル
2020-07-28 10:49:0210709ブラウズ

php Curl タイムアウト設定方法: 1. "curl_setopt($ch, opt)" を使用していくつかのタイムアウトを設定します; 2. "CURLOPT_DNS_CACHE_TIMEOUT" を使用して DNS 情報をメモリに保存する時間を設定します。

PHP CURLのタイムアウトを設定する方法

推奨: 「PHP チュートリアル

php でcurl を使用する場合のタイムアウト設定の詳細な方法

HTTP にアクセスする方法は多数あり、curl、socket、file_get_contents() などのメソッドを使用できます。

http にアクセスする場合は、タイムアウトの問題を考慮する必要があります。

1. CURL による HTTP アクセス

CURL は、HTTP プロトコル インターフェイスにアクセスするために一般的に使用されるライブラリ ライブラリであり、高いパフォーマンスといくつかの同時サポート機能を備えています。

curl_setopt($ch, opt) 主に次のようないくつかのタイムアウト設定を設定できます。

*(重要) CURLOPT_TIMEOUT は、cURL の実行が許可される最大秒数を設定します。

*(重要) CURLOPT_TIMEOUT_MS は、cURL の実行が許可される最大ミリ秒数を設定します。

(cURL 7.16.2 で追加。PHP 5.2.3 から利用可能)

CURLOPT_CONNECTTIMEOUT 接続を開始するまでの待機時間。0 に設定すると、無限に待機します。

CURLOPT_CONNECTTIMEOUT_MS 接続試行を待機する時間 (ミリ秒単位)。 0 に設定すると、無限に待機します。

(cURL 7.16.2 で追加。PHP 5.2.3 以降で利用可能)

CURLOPT_DNS_CACHE_TIMEOUT DNS 情報をメモリに保存する時間を設定します。デフォルトは 120 秒です。

1、curl の通常の第 2 レベルのタイムアウト:

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL,$url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); 
curl_setopt($ch, CURLOPT_TIMEOUT,60);   //只需要设置一个秒的数量就可以 
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
curl_setopt($ch, CURLOPT_USERAGENT, $defined_vars['HTTP_USER_AGENT']);

2、curl の通常の第 2 レベルのタイムアウトの使用:

curl_setopt($ch, CURLOPT_TIMEOUT,60);

3、curl にミリ秒のタイムアウトが必要な場合は、次のようにする必要があります。追加:

curl_easy_setopt(curl, CURLOPT_NOSIGNAL,1L); 
//或者 
curl_setopt ( $ch,  CURLOPT_NOSIGNAL,true);//支持毫秒级别超时设置

curl タイムアウト設定の例。

1、ミリ秒タイムアウトのカールの例:

<?php
if(!isset($_GET[&#39;foo&#39;])){  
        // Client  
        $ch = curl_init(&#39;http://example.com/&#39;);  
        curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);  
        curl_setopt($ch, CURLOPT_NOSIGNAL,1);    //注意,毫秒超时一定要设置这个  
        curl_setopt($ch, CURLOPT_TIMEOUT_MS,200);  //超时毫秒,cURL 7.16.2中被加入。从PHP 5.2.3起可使用  
        $data = curl_exec($ch);  
        $curl_errno = curl_errno($ch);  
        $curl_error = curl_error($ch);  
        curl_close($ch);  
   
        if($curl_errno >0){  
                echo "cURL Error ($curl_errno): $curl_error\n";  
        }else{  
                echo "Data received: $data\n";  
        }  
}else{  
        // Server  
        sleep(10);  
        echo "Done.";  
}

ヒント:

1、cURL バージョン >= libcurl/7.21.0 バージョン、ミリ秒タイムアウトは確実です。効果的であることを覚えておいてください。

2. Curl_multi のミリ秒レベルのタイムアウトの問題、1 回のアクセスでミリ秒レベルのタイムアウトがサポートされるため、Curl_multi の並列調整が不正確になります。

2. ストリーム処理による HTTP へのアクセス

HTTP プロトコルの処理には、curl に加えて、fsockopen またはファイル操作関数がよく使用されます。

これに関して、タイムアウト設定について説明しましょう。

通常、接続タイムアウトは直接設定できますが、ストリーム読み取りタイムアウトは個別に処理する必要があります。

次の実装コードを参照できます:

<?php
$tmCurrent = gettimeofday();  
       $intUSGone =($tmCurrent[&#39;sec&#39;]- $tmStart[&#39;sec&#39;])*1000000  
                  +($tmCurrent[&#39;usec&#39;]- $tmStart[&#39;usec&#39;]);  
       if($intUSGone > $this->_intReadTimeoutUS){  
           returnfalse;  
       }

または、組み込みのストリーム処理関数 stream_set_timeout() および stream_get_meta_data() を使用して処理します:

<?php
// Timeout in seconds   
$timeout =5;   
$fp = fsockopen("example.com",80, $errno, $errstr, $timeout);if($fp){   
        fwrite($fp,"GET / HTTP/1.0\r\n");   
        fwrite($fp,"Host: example.com\r\n");   
        fwrite($fp,"Connection: Close\r\n\r\n");   
        stream_set_blocking($fp,true);   //重要,设置为非阻塞模式  
        stream_set_timeout($fp,$timeout);   //设置超时  
        $info = stream_get_meta_data($fp);   
        while((!feof($fp))&&(!$info[&#39;timed_out&#39;])){   
                $data .= fgets($fp,4096);   
                $info = stream_get_meta_data($fp);   
                ob_flush;   
                flush();   
        }   
        if($info[&#39;timed_out&#39;]){   
                echo "Connection Timed Out!";   
        }else{   
                echo $data;   
        }}

file_get_contents timeout :

<?php
$timeout = array(  
    &#39;http&#39;=> array(  
        &#39;timeout&#39;=>5//设置一个超时时间,单位为秒  
    )  
);  
$ctx = stream_context_create($timeout);  
$text = file_get_contents("http://example.com/",0, $ctx);

fopen タイムアウト:

<?php
$timeout = array(  
   &#39;http&#39; => array(  
       &#39;timeout&#39; => 5 //设置一个超时时间,单位为秒  
   )  
);  
  
$ctx = stream_context_create($timeout);  
  
if ($fp = fopen("http://example.com/", "r", false, $ctx)) {  
 while( $c = fread($fp, 8192)) {  
   echo $c;  
 }  
 fclose($fp);  
}

以上がPHP CURLのタイムアウトを設定する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。