504错误是Nginx等待PHP-FPM响应超时主动断开,非PHP挂掉;须同步调大Nginx的fastcgi_read_timeout等三超时值与PHP-FPM的request_terminate_timeout,且后者须≥PHP.ini的max_execution_time,否则配置无效。

504不是PHP挂了,是Nginx等不及PHP响应就断开了——必须同步调大Nginx和PHP-FPM两端的超时阈值,漏改任意一端都会白忙。
查清到底是哪一环先超时
别一上来就改配置。先确认错误是否真由执行时间引起:tail -f /www/wwwlogs/php_error.log 看有没有 Maximum execution time of XXX seconds exceeded;同时 tail -f /www/wwwlogs/nginx_error.log 找 upstream timed out 或 read timeout。如果PHP日志里没超时报错,但Nginx日志明确写了 upstream timed out (110: Connection timed out),说明问题出在Nginx等不到PHP-FPM回包,而不是PHP自己卡死。
phpEnv下Nginx站点配置要改三处fastcgi超时
phpEnv默认用Nginx + PHP-FPM,fastcgi_read_timeout 是最关键的开关,它控制Nginx等待PHP-FPM返回响应的最大时间,默认仅60秒,比PHP的max_execution_time还短。不改它,PHP就算设成600秒也白搭。
- 进phpEnv面板 → 网站 → 对应站点 → 配置文件
- 在
location ~ \.php(.*)$块内,找到include fastcgi.conf;上方位置 - 确保这三行存在且值一致(建议300):
fastcgi_read_timeout 300;、fastcgi_send_timeout 300;、fastcgi_connect_timeout 300; - 保存后点「重载配置」,不是「保存」就完事
PHP-FPM的max_execution_time和request_terminate_timeout必须对齐
phpEnv里PHP配置分两层:一是全局PHP.ini里的max_execution_time,二是PHP-FPM进程池自身的request_terminate_timeout。后者优先级更高,且必须 ≥ 前者,否则PHP-FPM会在max_execution_time触发前就杀掉进程。
立即学习“PHP免费学习笔记(深入)”;
- 进phpEnv → PHP → 对应版本 → 配置修改 → 搜
max_execution_time,改成300 - 再点「配置文件」→ 打开
/www/server/php/{版本}/etc/php-fpm.conf→ 找request_terminate_timeout,设为300或0(0表示不限制,慎用) - 改完必须点「重载服务」,然后用
ps aux | grep php-fpm确认worker进程已更新 - 注意:.user.ini里的
max_execution_time会覆盖PHP.ini,如果子目录有这个文件,也得同步检查
别忽略底层资源和外部依赖
单纯拉高超时只是掩耳盗铃。504反复出现,大概率是脚本真卡在某处:
- 用
mysqladmin proc或SHOW PROCESSLIST看MySQL有没有长事务或锁表 - 检查代码里有没有
file_get_contents('http://...')这类未设timeout的远程请求 - 禁用
xdebug扩展(phpEnv里可在PHP设置中关闭),它在开启状态下会让脚本慢几倍 - 如果任务本身合理耗时(如导出Excel、生成PDF),别走Web请求,改用
shell_exec("nohup php /path/to/cli.php > /dev/null 2>&1 &")扔后台
最易被忽略的一点:phpEnv的Nginx配置里,fastcgi_read_timeout 和 proxy_read_timeout 是两套机制。如果你没用反向代理,只跑PHP,前者生效;加了proxy_pass才需要后者。很多人混着改,结果改了没用还找不到原因。



















