你是不是也遇到过这行报错👇
Fatal error: Maximum execution time of 30 seconds exceeded
第一反应通常是:
“是不是要改 php.ini?”
“要不要 set_time_limit(0)?”
但现实是——
很多时候你根本没权限改配置,甚至改了也没用。
👉 好消息是:
这个问题,90% 不需要动服务器配置,也能解决。
一、先讲人话:这个错误到底在说什么?
PHP 有一个默认安全限制:
单个脚本最多执行 30 秒(或 60 秒)
超过这个时间,PHP 就会强制中断,
直接给你甩一句:
Maximum execution time exceeded
注意重点👇
❌ 不是程序“死循环”
❌ 不是服务器“扛不住”
✅ 是 你的代码逻辑太慢
二、先别急着“加时间”,这是新手最大坑
很多人第一招就是:
set_time_limit(0);
或者改:
max_execution_time = 300
问题是:
- 虚拟主机 → 无效
- 宝塔限制 → 被覆盖
- PHP-FPM → 仍然超时
- 云函数 / Serverless → 直接不让你改
👉 而且:
时间拉长 ≠ 程序更快
三、不改配置的 7 种“救命解法”(实战)
✅ 解法 1:把“一个慢操作”拆成多个小步骤
❌ 错误写法(常见):
foreach ($users as $user) {
doSomethingVerySlow($user);
}
✔ 正确思路:
- 分批处理
- 每次 50 / 100 条
- 用分页 or offset
LIMIT 0, 100
LIMIT 100, 100
👉 拆时间,是最稳的解法
✅ 解法 2:把“同步操作”改成“异步”
比如这些场景:
- 调第三方 API
- 发短信 / 邮件
- 调用外部接口
❌ 同步写法 → 必超时
✔ 改成:
- 队列
- 延迟任务
- 异步请求
哪怕你只是:
- curl 并行
- fastcgi_finish_request()
都能救命。
✅ 解法 3:cURL 超时设置(极其关键)
很多超时根本不是 PHP 慢,
是 接口一直在等返回。
错误示例(默认无超时):
curl_exec($ch);
正确写法:
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
👉 接口卡住 = PHP 被拖死
✅ 解法 4:避免在循环里做 IO 操作
典型作死行为:
- 循环里查数据库
- 循环里写文件
- 循环里调 API
❌
foreach (...) {
queryDB();
}
✔ 优化思路:
- 一次查全
- 批量写入
- 内存处理完再落库
✅ 解法 5:数据库慢,别怪 PHP
很多“执行超时”其实是:
- SQL 没索引
- 全表扫描
- JOIN 写炸了
👉 PHP 在等数据库,
时间全耗在 SQL 上。
建议你直接:
EXPLAIN your_sql;
只要看到:
- type = ALL
- rows 很大
基本就是它拖死的。
✅ 解法 6:CLI 执行(绕过 Web 超时)
如果是:
- 定时任务
- 大批量脚本
- 数据迁移
👉 别走浏览器!
改用:
php your_script.php
CLI 模式:
- 没 Web 超时限制
- 稳定得多
✅ 解法 7:及时释放资源(很多人忽略)
长脚本一定要:
unset($bigArray);
gc_collect_cycles();
否则:
- 内存飙升
- 执行变慢
- 更容易超时
四、什么时候“加时间”才是对的?
✔ 可以加时间的情况:
- 已确认逻辑没问题
- 已优化 SQL
- 已拆分流程
- 只是任务本身就长
这时候再:
set_time_limit(300);
👉 顺序别反了
五、一句话总结(收藏级)
Maximum execution time exceeded
不是“时间不够”,
而是“代码方式错了”。
真正的解法不是改配置,
而是:
- 拆流程
- 控接口
- 优 SQL
- 避同步