
在 laravel 中,可通过 `ini_set('max_execution_time', '0')` 取消 php 脚本的最大执行时间限制,使路由(如常驻服务接口)持续运行而不被“maximum execution time exceeded”中断。需配合 web 服务器配置与进程管理策略使用。
Laravel 默认运行于传统请求-响应模型下,而“永远不终止”的路由(例如模拟长轮询、心跳服务或轻量级守护任务)本质上违背了该模型的设计初衷。尽管技术上可通过 PHP 配置绕过超时限制,但必须谨慎评估其适用性与风险。
✅ 正确设置无时限执行:
在路由处理逻辑(如控制器方法)开头,立即调用:
toISOString() . "\n";
ob_flush();
flush(); // 确保实时发送到客户端
// 每 5 秒检查一次(避免 CPU 占满)
sleep(5);
// 【重要】建议加入优雅退出条件(如文件标记、Redis 信号等)
// if (cache('service:stop') === true) break;
}
}⚠️ 关键注意事项:
-
Web 服务器层仍会超时:ini_set 仅影响 PHP 脚本本身,Nginx/Apache 通常默认 60s 超时。需同步调整:
- Nginx:proxy_read_timeout 3600;(在 location 或 server 块中)
- Apache:Timeout 3600(httpd.conf)
- 不要在生产 Web 请求中滥用:长期阻塞的 PHP 进程会耗尽 FPM worker 或 Apache 并发连接,导致服务不可用。
-
推荐替代方案:
- ✅ 使用 Laravel Artisan 命令 + supervisord / systemd 管理后台常驻进程(如 php artisan serve:daemon);
- ✅ 通过队列(Redis/SQS)+ Horizon 实现高可靠异步任务;
- ✅ 对接专业消息队列(RabbitMQ/Kafka)或 WebSocket 服务(如 Soketi、Laravel WebSockets)。
? 总结:ini_set('max_execution_time', '0') 是解决 PHP 层超时的直接方法,但仅适用于调试、内网工具或极简场景;面向生产环境的“永续服务”,应转向进程守护、事件驱动或专用协议方案,兼顾稳定性、可观测性与资源可控性。











