php Curl タイムアウト設定方法: 1. "curl_setopt($ch, opt)" を使用していくつかのタイムアウトを設定します; 2. "CURLOPT_DNS_CACHE_TIMEOUT" を使用して DNS 情報をメモリに保存する時間を設定します。
推奨: 「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['foo'])){ // Client $ch = curl_init('http://example.com/'); 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['sec']- $tmStart['sec'])*1000000 +($tmCurrent['usec']- $tmStart['usec']); 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['timed_out'])){ $data .= fgets($fp,4096); $info = stream_get_meta_data($fp); ob_flush; flush(); } if($info['timed_out']){ echo "Connection Timed Out!"; }else{ echo $data; }}
file_get_contents timeout :
<?php $timeout = array( 'http'=> array( 'timeout'=>5//设置一个超时时间,单位为秒 ) ); $ctx = stream_context_create($timeout); $text = file_get_contents("http://example.com/",0, $ctx);
fopen タイムアウト:
<?php $timeout = array( 'http' => array( 'timeout' => 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 サイトの他の関連記事を参照してください。