作为程序员一定要保持良好的睡眠,才能好编程

request_terminate_timeout引起的资源问题

发布时间:2019-01-24


request_terminate_timeout的值如果设置为0或者过长的时间,可能会引起file_get_contents的资源问题。


如果file_get_contents请求的远程资源如果反应过慢,file_get_contents就会一直卡在那里不会超时。我们知道php.ini 里面max_execution_time 可以设置 PHP 脚本的最大执行时间,但是,在 php-cgi(php-fpm) 中,该参数不会起效。


真正能够控制 PHP 脚本最大执行时间的是 php-fpm.conf 配置文件中的request_terminate_timeout参数。


request_terminate_timeout默认值为 0 秒,也就是说,PHP 脚本会一直执行下去。

这样,当所有的 php-cgi 进程都卡在 file_get_contents() 函数时,这台 Nginx+PHP 的 WebServer 已经无法再处理新的 PHP 请求了


Nginx 将给用户返回“502 Bad Gateway”。修改该参数,设置一个 PHP 脚本最大执行时间是必要的,


但是,治标不治本。例如改成 30s,如果发生 file_get_contents() 获取网页内容较慢的情况,这就意味着 150 个 php-cgi 进程,每秒钟只能处理 5 个请求,WebServer 同样很难避免”502 Bad Gateway”。


解决办法是:request_terminate_timeout设置为10s或者一个合理的值


或者给file_get_contents加一个超时参数

$ctx = stream_context_create(array(
    'http' => array(
        'timeout' => 10    //设置一个超时时间,单位为秒
    )
));
 
file_get_contents($str, 0, $ctx);