apache的timeout不影响php脚本执行时间,真正控制php超时的是max_execution_time等php配置及php-fpm的request_terminate_timeout;修改需按优先级覆盖并重启服务验证。

Apache本身不控制PHP脚本超时,真正起作用的是PHP配置
很多人以为在 httpd.conf 或虚拟主机里加 Timeout 就能限制PHP执行时间,其实不是。Apache的 Timeout 指的是整个HTTP请求的网络层超时(比如客户端断连、传输卡住),对PHP脚本内部的 sleep()、循环或数据库查询毫无影响。
真正决定PHP脚本最多跑多久的,是PHP自身的运行时配置项:
-
max_execution_time:默认30秒,控制单个脚本最大执行时间(单位:秒) -
max_input_time:控制接收POST/GET数据的最长时间(如上传大文件时解析POST体) -
memory_limit:虽不是时间相关,但内存耗尽会直接中止脚本,常被误认为“超时”
修改max_execution_time的三种生效方式
PHP配置可从多个层级覆盖,优先级从高到低为:代码内设置 → .htaccess → php.ini。实际使用中需注意生效条件:
- 用
set_time_limit(60)在脚本开头调用,可动态延长(设为0表示不限制),但仅对CLI模式下的Apache模块(mod_php)有效;PHP-FPM下该函数被禁用 - 在网站根目录的
.htaccess中写php_value max_execution_time 120,前提是Apache启用了AllowOverride Options=ExecCGI且PHP以模块方式运行(mod_php);PHP-FPM不读.htaccess - 直接改全局
php.ini最稳妥:max_execution_time = 120,改完必须重启PHP服务(systemctl restart php-fpm)或Apache(systemctl restart httpd),否则不生效
PHP-FPM环境下必须改php-fpm.conf或池配置
现在大多数生产环境用PHP-FPM + Apache(通过 proxy_fcgi 模块),此时仅改 php.ini 还不够——FPM自身也有超时控制,会提前kill掉“慢”进程。
立即学习“PHP免费学习笔记(深入)”;
关键配置在FPM池文件(如 /etc/php-fpm.d/www.conf)中:
-
request_terminate_timeout:硬性超时,到点直接杀进程(单位支持s或m),例如request_terminate_timeout = 120s -
request_slowlog_timeout:配合slowlog记录慢请求,不影响执行,仅用于诊断 - 注意:如果
request_terminate_timeout小于max_execution_time,PHP脚本会在到达PHP层限制前就被FPM强制终止,错误日志里通常出现WARNING: [pool www] child 12345 exited on signal 15 (SIGTERM)
验证是否生效:别只看phpinfo()页面
phpinfo() 显示的是当前请求加载的配置值,但它不反映FPM层的 request_terminate_timeout。真实超时行为需实测:
- 写一个测试脚本:
<?php sleep(90); echo 'done'; ?>,访问它,看是返回内容、空白页,还是504 Gateway Timeout(说明是Apache或FPM拦截了) - 查日志:
tail -f /var/log/httpd/error_log和tail -f /var/log/php-fpm/www-slow.log(如果开了slowlog) - 确认PHP运行模式:
php -i | grep "Server API",输出Server API => FPM/FastCGI就不能依赖.htaccess
FPM和Apache双层超时容易互相掩盖问题,调的时候得一层层排除,尤其别忘了检查 ProxyTimeout(如果Apache用 mod_proxy_fcgi)——它默认是60秒,比FPM还短。











