504错误源于Nginx网关超时,需先排查PHP错误日志是否有“Maximum execution time exceeded”,再同步修改宝塔中PHP配置的三处max_execution_time并重启服务,同时调大fastcgi_read_timeout;避免盲目延长超时,应定位卡点、拆分异步任务。

PHP脚本执行超时导致504,先确认是不是max_execution_time惹的祸
504错误本身是Nginx返回的网关超时,不代表PHP没在跑,只代表Nginx等不到PHP响应就放弃了。常见诱因确实是PHP脚本卡在max_execution_time限制上——但别急着改它。先用phpinfo()或命令行php -i | grep max_execution_time查当前值,再看错误发生时PHP错误日志(/www/wwwlogs/php_error.log)里有没有Maximum execution time of XXX seconds exceeded。没有这句,调max_execution_time基本白忙。
宝塔面板里改max_execution_time的三个位置必须同步
宝塔对PHP配置做了分层管理,漏改任何一个都会失效:
- 在面板「网站」→ 对应站点 → 「PHP版本」→ 「设置」→ 「配置修改」里改
max_execution_time,这是全局PHP-FPM池的默认值 - 进「PHP管理」→ 选中对应版本 → 「配置文件」里手动改
max_execution_time,这个值会被上面的界面操作覆盖,但重启PHP前临时生效 - 如果用了
.user.ini(常见于子目录独立PHP配置),它里面的max_execution_time会覆盖前两者,且优先级最高
改完必须点「重载配置」+「重启PHP服务」,光点「保存」不生效。顺手用ps aux | grep php-fpm确认进程已更新。
单纯调高max_execution_time可能掩盖更严重的问题
设成300甚至600秒不是长久之计,尤其在线上环境:
立即学习“PHP免费学习笔记(深入)”;
- 数据库慢查询、未加索引的
SELECT *、循环里反复file_get_contents()远程URL,都会让脚本卡住,调时间只是拖死更多请求 - Nginx的
fastcgi_read_timeout默认60秒,它比PHP的max_execution_time还早放弃,所以必须同步调大(宝塔在「网站」→「设置」→「配置文件」里搜fastcgi_read_timeout) -
set_time_limit(0)在PHP-FPM模式下无效,FPM有自己的超时控制,硬写这句没用
建议用strace -p $(pgrep php-fpm) -e trace=connect,sendto,recvfrom抓一下卡在哪儿,比盲目调参靠谱得多。
异步任务别走Web请求,该拆就拆
如果业务确实需要长耗时操作(比如导出万行Excel、处理视频),硬扛max_execution_time是反模式:
- 用
shell_exec("nohup php /path/to/task.php > /dev/null 2>&1 &")扔后台,Web端只返回任务ID - 用宝塔「计划任务」跑定时PHP脚本,配合Redis或数据库标记状态
- 把耗时逻辑抽成API,用
curl -s --no-buffer异步调用,主流程不等待
Web请求生命周期本就不该承担长任务,504只是系统在提醒你:这里不该这么干。



















