php.ini 中 max_execution_time = 300
php-fpm.conf request_terminate_timeout = 100
基本公式如下:
超时时间 = min(max_execution_time , request_terminate_timeout)
注意 set_time_limit()函数和配置指令max_execution_time只影响脚本本身执行的时间。任何发生在诸如使用system() ,file_get_contents()的系统调用,流操作,数据库操作等不会被计算在执行时间中,request_terminate_timeout 就是真正的执行时间
如果是 max_execution_time 起作用,http状态码为500 页面会显示最大执行时间等报错信息,而request_terminate_timeout 起作用,http状态码为502 页面返回的内容为nginx502页面
在使用file_get_contents函数时,如果不设置超时,而请求的接口又不能很快的返回时,可能能会导致 request_terminate_timeout 超时,子进程会被kill 系统提示页面报 502,被系统kill后,数据的完整性无法保证,应尽量避免没有超时限制的请求操作,包括mysql的连接,执行,redis的连接等
使用curl请求也要设置超时时间
/** * 统一封装的file_get_contents, 原生的file_get_contents绝对不能使用,没有设置超时时间,如果碰到网络问题,这个进程会一直卡在那边,并发高的时候这里会卡住大量进程,导致单机并发上不去 * * @param string $url 请求url * @param integer $timeout 超时时间 * @param array $header 请求头部 * @return */ function pft_file_get_contents($url, $timeout = 10, $header = []){ $url = (string)$url; $timeout = (int)$timeout; $timeout = $timeout <= 0 ? 10 : $timeout; $contextOptions = [ 'http' => ['timeout' => $timeout] ]; if($header) { $contextOptions['http']['header'] = $header; } $context = stream_context_create($contextOptions); $res = file_get_contents($url, false, $context); return $res; }