最直接有效的方式是修改 php.ini 中的 max_execution_time 并重启 Web 服务;需同步调整 Nginx/Apache/CDN 等各层超时配置,ignore_user_abort 不能绕过该限制。

php.ini 里设置 max_execution_time 最直接有效
PHP 脚本默认最多执行 30 秒,超时会报 Fatal error: Maximum execution time of X seconds exceeded。改这个值最稳妥的方式是修改服务器级配置文件 php.ini:
- 找到正在使用的
php.ini文件路径:运行php --ini(CLI)或phpinfo()(Web 环境)确认 - 搜索并修改
max_execution_time = 30,比如改成max_execution_time = 300(5 分钟) - 改完必须重启 Web 服务(
systemctl restart apache2或systemctl restart php-fpm),否则不生效 - 注意:设为
0表示不限制,但生产环境不建议,可能掩盖死循环或资源卡死问题
运行时用 set_time_limit() 动态延长
适合不确定耗时、但又不想全局调高超时的场景,比如导出大数据、批量处理任务。它从调用时刻起重新计时:
-
set_time_limit(60)表示从这行开始再给 60 秒,不是累计到之前时间 - 在 CLI 模式下默认生效;Web 模式下需确保
safe_mode关闭(PHP 5.4+ 已移除)、且未被disable_functions禁用 - 若脚本已超时,
set_time_limit()不会“救活”当前请求,只对后续执行段起作用 - 频繁调用无意义,比如每循环一次都
set_time_limit(10),反而增加开销
Web 服务器层也得同步调整
光改 PHP 不够——Nginx/Apache 本身也有超时控制,容易形成“套娃超时”:
- Nginx:检查
fastcgi_read_timeout(对应 PHP-FPM)或proxy_read_timeout(反代 PHP-CGI),至少 ≥ PHP 的max_execution_time - Apache + mod_php:一般跟随 PHP 设置;但用
mod_fcgid或php-fpm时,要额外看FcgidIOTimeout或 FPM pool 配置里的request_terminate_timeout - Cloudflare 等 CDN 层也可能拦截长连接,若走代理,需确认其后台超时设置(如 Cloudflare 默认 100 秒)
为什么 ignore_user_abort(true) 不能解决超时
有人误以为只要加了 ignore_user_abort(true) 就能“后台跑完”,其实它只影响客户端断开后脚本是否继续执行,并不绕过 max_execution_time 限制:
立即学习“PHP免费学习笔记(深入)”;
- 即使用户关掉浏览器,PHP 进程仍受秒数限制,到点一样被 kill
- 真正需要长时间运行的任务,应拆成队列(如 Redis + Worker)或转为 CLI 脚本由系统 cron 触发
-
ignore_user_abort(true)配合set_time_limit(0)才可能“撑住”,但风险极高,易堆积僵尸进程











