PHP超时处理全面总结(2)

发表于:2013-10-28来源:酷勤网作者:不详点击数: 标签:php
说明: 对于一个keep-alive连接上的连续请求,发送第一个请求内容的最大间隔由参数max-read-idle决定,从第二个请求起,发送请求内容的最大间隔由参数ma

  说明:

  对于一个keep-alive连接上的连续请求,发送第一个请求内容的最大间隔由参数max-read-idle决定,从第二个请求起,发送请求内容的最大间隔由参数max-keep-alive-idle决定。请求间的间隔超时也由max-keep-alive-idle决定。发送请求内容的总时间超时由参数read-timeout决定。Lighttpd与后端交互数据的超时由max-connection-idle决定。

  延伸阅读:

  http://www.snooda.com/read/244

  [ Nginx ]

  配置:nginx.conf

http{

#Fastcgi:(针对后端的fastcgi生效,fastcgi不属于proxy模式)

fastcgi_connect_timeout5;#连接超时

fastcgi_send_timeout10; #写超时

fastcgi_read_timeout10;#读取超时

#Proxy:(针对proxy/upstreams的生效)

proxy_connect_timeout15s;#连接超时

proxy_read_timeout24s;#读超时

proxy_send_timeout10s; #写超时

}

  说明:

  Nginx 的超时设置倒是非常清晰容易理解,上面超时针对不同工作模式,但是因为超时带来的问题是非常多的。

  延伸阅读:

  http://hi.baidu.com/pibuchou/blog/item/a1e330dd71fb8a5995ee3753.html

  http://hi.baidu.com/pibuchou/blog/item/7cbccff0a3b77dc60b46e024.html

  http://hi.baidu.com/pibuchou/blog/item/10a549818f7e4c9df703a626.html

  http://www.apoyl.com/?p=466

  【PHP本身超时处理】

  [ PHP-fpm ]

  配置:php-fpm.conf

<?xmlversion="1.0"?>

<configuration>

//...

Setsthelimitonthenumberofsimultaneousrequeststhatwillbeserved.

EquivalenttoApacheMaxClientsdirective.

EquivalenttoPHP_FCGI_CHILDRENenvironmentinoriginalphp.fcgi

Usedwithanypm_style.

#php-cgi的进程数量

<valuename="max_children">128</value>

Thetimeout(inseconds)forservingasinglerequestafterwhichtheworkerprocesswillbeterminated

Shouldbeusedwhen'max_execution_time'inioptiondoesnotstopscriptexecutionforsomereason

'0s'means'off'

#php-fpm 请求执行超时时间,0s为永不超时,否则设置一个 Ns 为超时的秒数

<valuename="request_terminate_timeout">0s</value>

Thetimeout(inseconds)forservingofsinglerequestafterwhichaphpbacktracewillbedumpedtoslow.logfile

'0s'means'off'

<valuename="request_slowlog_timeout">0s</value>

</configuration>

  说明:

  在php.ini中,有一个参数max_execution_time可以设置PHP脚本的最大执行时间,但是,在php-cgi(php-fpm)中,该参数不会起效。真正能够控制PHP脚本最大执行时:

  0s

  就是说如果是使用mod_php5.so的模式运行max_execution_time是会生效的,但是如果是php-fpm模式中运行时不生效的。

  延伸阅读:

  http://blog.s135.com/file_get_contents/

  [ PHP ]

  配置:php.ini

  选项:

  max_execution_time=30

  或者在代码里设置:

  ini_set("max_execution_time",30);

  set_time_limit(30);

  说明:

  对当前会话生效,比如设置0一直不超时,但是如果php的safe_mode打开了,这些设置都会不生效。

  效果一样,但是具体内容需要参考php-fpm部分内容,如果php-fpm中设置了request_terminate_timeout的话,那么max_execution_time就不生效。

  【后端&接口访问超时】

  【HTTP访问】

  一般我们访问HTTP方式很多,主要是:curl,socket,file_get_contents()等方法。

  如果碰到对方服务器一直没有响应的时候,我们就悲剧了,很容易把整个服务器搞死,所以在访问http的时候也需要考虑超时的问题。

  [ CURL 访问HTTP]

  CURL 是我们常用的一种比较靠谱的访问HTTP协议接口的lib库,性能高,还有一些并发支持的功能等。

  CURL:

  curl_setopt($ch,opt)可以设置一些超时的设置,主要包括:

  *(重要)CURLOPT_TIMEOUT设置cURL允许执行的最长秒数。

  *(重要)CURLOPT_TIMEOUT_MS设置cURL允许执行的最长毫秒数。(在cURL7.16.2中被加入。从PHP5.2.3起可使用。)

  CURLOPT_CONNECTTIMEOUT在发起连接前等待的时间,如果设置为0,则无限等待。

  CURLOPT_CONNECTTIMEOUT_MS尝试连接等待的时间,以毫秒为单位。如果设置为0,则无限等待。在cURL7.16.2中被加入。从PHP5.2.3开始可用。

  CURLOPT_DNS_CACHE_TIMEOUT设置在内存中保存DNS信息的时间,默认为120秒。

  curl普通秒级超时:

  $ch=curl_init();

  curl_setopt($ch,CURLOPT_URL,$url);

  curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);

原文转自:http://www.kuqin.com/web/20120808/324135.html