PHP 执行超时 Maximum execution time exceeded?不改配置也能救!
你是不是也遇到过这行报错👇
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
避同步

浙公网安备 33010602011771号