Home > Article > Backend Development > Detailed explanation of php curl timeout setting
This article introduces the detailed method of setting timeout when using curl in PHP. Please refer to it. I hope it will be of some help to you.
There are many ways to access HTTP, you can use curl, socket, file_get_contents() and other methods. When accessing http, you need to consider the timeout issue. 1. CURL access HTTP CURL is a commonly used lib library for accessing HTTP protocol interfaces. It has high performance and has some concurrency support functions. curl_setopt($ch, opt) can set some timeout settings, mainly including: *(Important) CURLOPT_TIMEOUT sets the maximum number of seconds cURL is allowed to execute. *(Important) CURLOPT_TIMEOUT_MS sets the maximum number of milliseconds that cURL is allowed to execute. (Added in cURL 7.16.2. Available from PHP 5.2.3 onwards) CURLOPT_CONNECTTIMEOUT The time to wait before initiating a connection. If set to 0, it will wait indefinitely. CURLOPT_CONNECTTIMEOUT_MS The time, in milliseconds, to wait for a connection attempt. If set to 0, wait infinitely. (Added in cURL 7.16.2. Available since PHP 5.2.3) CURLOPT_DNS_CACHE_TIMEOUT sets the time to save DNS information in memory, the default is 120 seconds. 1, curl normal second-level timeout: $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,$url); curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); curl_setopt($ch, CURLOPT_TIMEOUT,60); //Just set the number of seconds curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_USERAGENT, $defined_vars['HTTP_USER_AGENT']);2, curl normal second-level timeout use: curl_setopt($ch, CURLOPT_TIMEOUT,60);3. If curl needs to time out in milliseconds, it needs to be increased: curl_easy_setopt(curl, CURLOPT_NOSIGNAL,1L); //or curl_setopt ($ch, CURLOPT_NOSIGNAL,true);//Support millisecond level timeout settingsExample of curl timeout setting. 1, curl example of a millisecond timeout: <?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."; } Tips: 1. cURL version >= libcurl/7.21.0 version, millisecond timeout will definitely take effect, remember. 2. The problem of curl_multi’s millisecond-level timeout. A single access supports ms-level timeout. Curl_multi’s parallel adjustment of multiple times will be inaccurate. 2. Access HTTP via stream processing In addition to curl, fsockopen or file operation functions are often used to process the HTTP protocol. Let’s talk about the timeout settings in this regard. Generally, the connection timeout can be set directly, but the stream read timeout needs to be handled separately. You can refer to the following implementation code: <?php $tmCurrent = gettimeofday(); $intUSGone =($tmCurrent['sec']- $tmStart['sec'])*1000000 +($tmCurrent['usec']- $tmStart['usec']); if($intUSGone > $this->_intReadTimeoutUS){ returnfalse; } Or use the built-in stream processing functions stream_set_timeout() and stream_get_meta_data() to process: <?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 timeout: <?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); } |