咨询行业网站制作,山西两学一做网站登录,企业邮箱哪家比较好,建设农家书屋官方网站一般我们访问HTTP方式很多#xff0c;主要是#xff1a;curl, socket, file_get_contents() 等方法。 如果碰到对方服务器一直没有响应的时候#xff0c;我们就悲剧了#xff0c;很容易把整个服务器搞死#xff0c;所以在访问http的时候也需要考虑超时的问题。 [b]一、CUR…一般我们访问HTTP方式很多主要是curl, socket, file_get_contents() 等方法。 如果碰到对方服务器一直没有响应的时候我们就悲剧了很容易把整个服务器搞死所以在访问http的时候也需要考虑超时的问题。 [b]一、CURL 访问HTTP[/b] CURL 是我们常用的一种比较靠谱的访问HTTP协议接口的lib库性能高还有一些并发支持的功能等。 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秒。 curl普通秒级超时 $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]); curl普通秒级超时使用 curl_setopt($ch, CURLOPT_TIMEOUT,60); curl如果需要进行毫秒超时需要增加 curl_easy_setopt(curl, CURLOPT_NOSIGNAL,1L);       //或者是       curl_setopt ( $ch,  CURLOPT_NOSIGNAL,true);//是可以支持毫秒级别超时设置的 curl一个毫秒级超时的例子 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的毫秒级超时也有问题。。单次访问是支持ms级超时的curl_multi并行调多个会不准 [b]二、流处理方式访问HTTP[/b] 除了curl我们还经常自己使用fsockopen、或者是file操作函数来进行HTTP协议的处理所以我们对这块的超时处理也是必须的。 一般连接超时可以直接设置但是流读取超时需要单独处理。 自己写代码处理: $tmCurrent  gettimeofday();        $intUSGone ($tmCurrent[sec]- $tmStart[sec])*1000000                   ($tmCurrent[usec]- $tmStart[usec]);        if($intUSGone  $this-_intReadTimeoutUS){            returnfalse;        } 或者使用内置流处理函数 stream_set_timeout() 和 stream_get_meta_data() 处理 // 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  array(    http array(        timeout5//设置一个超时时间单位为秒    ));$ctx  stream_context_create($timeout);$text  file_get_contents(http://example.com/,0, $ctx); fopen 超时 $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);} 如果您觉得本文的内容对您的学习有所帮助您可以微信 
[img]http://dl2.iteye.com/upload/attachment/0109/0668/fb266dfa-95ca-3d09-b41e-5f04a19ba9a1.png[/img]