504错误主因是nginx的fastcgi_read_timeout过短,需同步调整nginx三超时、php-fpm的request_terminate_timeout、php.ini的max_execution_time及宝塔网站设置中的“网站超时时间”,四者数值对齐并重载/重启对应服务。

直接改 max_execution_time 基本没用,504 错误大概率是 Nginx 在等 PHP 返回时先放弃了——它根本没机会执行到 PHP 的超时判断那一步。
为什么改了 php.ini 还是 504?Nginx 的 fastcgi_read_timeout 才是第一道关卡
Nginx 默认只等 60 秒就断开连接,返回 504。哪怕你把 max_execution_time 设成 3600,只要 fastcgi_read_timeout 还是 60,PHP 进程还在跑,Nginx 已经把连接关了。
- 进宝塔 → 网站 → 设置 → 配置文件,在
location ~ \.php(.*)$ { }块内添加或修改这三行(值必须一致且 ≥ 你期望的脚本运行时间):fastcgi_read_timeout 600;<br>fastcgi_send_timeout 600;<br>fastcgi_connect_timeout 600;
- 别只加
fastcgi_read_timeout,漏掉另外两个在高负载或网络抖动时照样中断 - 改完必须点「重载配置」,光重启 Nginx 或 PHP 都不生效
- 这个值要 ≥ 后续 PHP-FPM 的
request_terminate_timeout,否则形同虚设
PHP-FPM 的 request_terminate_timeout 是真正的硬性熔断开关
max_execution_time 是脚本层限制,而 request_terminate_timeout 是 PHP-FPM 进程级强制 kill,优先级更高。它默认可能被注释,但一旦启用,就会在设定时间一到直接干掉整个进程。
- 路径:
/www/server/php/80/etc/php-fpm.d/www.conf(80 换成你实际 PHP 版本号) - 找到并取消注释这两行(或新增),确保值一致且 ≥ Nginx 的 timeout:
request_terminate_timeout = 600<br>request_slowlog_timeout = 10
- 改完必须「重启 PHP 服务」,不是重载,
systemctl restart php-fpm-80或宝塔面板点「重启」 - 设为 0 表示不限制,但生产环境不建议,会拖垮并发能力
网站级或脚本级临时调整,别只依赖全局 php.ini
全局改 max_execution_time 影响所有站点;如果只想放开某个后台接口(比如导出报表),有更精准的方式。
- 单站用
.user.ini:进网站根目录,新建或编辑.user.ini,写入max_execution_time = 600<br>max_input_time = 600
,权限设为 644 - 确认
user_ini.filename在 phpinfo 中已启用,否则该文件被忽略 - 代码里用
set_time_limit(600)可临时覆盖,但前提是没被disable_functions屏蔽,且不能在php_admin_value锁死的环境下生效 - 注意:某些框架(如 Laravel 的 HTTP 客户端)、数据库连接、cURL 请求都有独立超时设置,它们和
max_execution_time无关
别漏掉宝塔隐藏的「网站超时时间」开关
这个值藏在网站设置最底部,优先级极高,会直接覆盖 Nginx 配置里的超时逻辑。很多人调完了 Nginx 和 PHP,结果这里还是默认 60,504 照样来。
- 进宝塔 → 网站 → 设置 → 网站目录 → 往下拉到底部,找到「网站超时时间」输入框
- 把它改成和
fastcgi_read_timeout一致(如 600),然后点「保存」 - 保存后必须手动点右上角「重载配置」,这个操作不会自动触发
- 该设置对当前 PHP 版本下所有共用它的站点生效,多站点混用时按最长需求设
真正卡住的往往不是 PHP 脚本本身,而是 Nginx 等不到响应、PHP-FPM 强制杀进程、或者宝塔界面里那个藏得最深的数字。四层超时(Nginx、PHP-FPM、php.ini、宝塔网站设置)必须数值对齐、全部重启/重载,缺一不可。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











