该错误本质是php脚本执行时间超过默认30秒限制;需先区分不合理超时(代码低效、未加索引、隐性死循环)与合理超时(大数据导出、批量统计),再分层排查:脚本级调set_time_limit、web服务器调fastcgi_read_timeout、连接层设curl/mysql超时参数,并禁用文件会话gc或迁移到redis。

PHP网站部署后出现超时,通常不是单一环节的问题,而是脚本执行、网络连接、数据库响应、Web服务器配置等多个层面共同作用的结果。解决时需分层排查、针对性调整,而不是盲目延长总时间。
明确超时发生在哪一层
先确认是哪种超时:页面白屏卡住?报“504 Gateway Timeout”?还是“Maximum execution time of 30 seconds exceeded”?不同提示指向不同层级:
- 出现
Fatal error: Maximum execution time exceeded→ PHP 脚本级超时(max_execution_time或set_time_limit触发) - 显示
504 Gateway Timeout→ Nginx/Apache 等 Web 服务器等待 PHP 响应超时 - 报错
cURL error 28、Connection timed out、SQLSTATE[HY000] [2002]→ 外部连接(HTTP、MySQL、Redis)建立或响应超时 - 页面加载一半就中断、日志里有
PHP-FPM pool www reached 'max_children'→ 进程阻塞,大概率是某次连接没设超时,长期挂起
PHP 脚本执行时间要合理控制
不要一上来就 set_time_limit(0) 或把 max_execution_time 改成 3000。超时本质是资源保护机制,无限制容易拖垮整个服务。
- 在 php.ini 中设置全局上限:
max_execution_time = 120(2分钟),生产环境不建议超过 300 - 若某个接口确实需要更久(如导出报表),在脚本开头调用:
set_time_limit(300) - Apache 下可用
.htaccess单独设:php_value max_execution_time 240(仅限模块模式) - Nginx 用户必须同步调整
fastcgi_read_timeout 300,否则 PHP 即使没超时,Nginx 也会在 60 秒后断开
外部连接必须显式设超时
默认超时往往过长(如 MySQL connect_timeout=10,但 wait_timeout=28800;cURL 默认 0 表示无限),极易造成进程堆积。
cURL 请求务必分开设连接与总超时:
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 3000);curl_setopt($ch, CURLOPT_TIMEOUT_MS, 15000);
再加低速保护:curl_setopt($ch, CURLOPT_LOW_SPEED_LIMIT, 1); curl_setopt($ch, CURLOPT_LOW_SPEED_TIME, 30);MySQLi 连接后立即设读写超时:
mysqli_options($mysqli, MYSQLI_OPT_READ_TIMEOUT, 5);mysqli_options($mysqli, MYSQLI_OPT_WRITE_TIMEOUT, 5);
配合 SQL 层SET SESSION wait_timeout = 30;(PHP 8.1+ + MySQL 8.0.12+)-
file_get_contents()等流操作,用stream_context_create()指定:$ctx = stream_context_create(['http' => ['timeout' => 10, 'connect_timeout' => 3]]); file_get_contents('https://api.example.com', false, $ctx);
MySQL 连接空闲超时要主动管理
本地部署常见问题:PHP 连接 MySQL 后长期不用,被 MySQL 主动断开,后续查询直接报错。
修改 MySQL 配置文件(
my.cnf或my.ini)的[mysqld]段:wait_timeout = 28800interactive_timeout = 28800
修改后重启 MySQL 服务PHP 层更可靠的做法是保活:
使用 mysqli 时,执行查询前加if (!$mysqli->ping()) { $mysqli->real_connect(...); }
使用 PDO 时,启用PDO::ATTR_EMULATE_PREPARES并在每次操作前调用$pdo->ping()
避免会话文件拖慢请求
当 /tmp 或自定义 session.save_path 下积累数万甚至百万个会话文件,PHP 启动 session 时触发 GC(垃圾回收)会遍历整个目录,耗时几十秒。
- 立即禁用内置 GC:在 php.ini 中设
session.gc_probability = 0 - 改用 Redis 存储 session:
session.save_handler = redissession.save_path = "tcp://127.0.0.1:6379?database=2"
同时确保redis.so已启用
不复杂但容易忽略。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











