
在 laravel 中,可通过设置 `ini_set('max_execution_time', '0')` 取消脚本最大执行时间限制,使路由(如常驻服务接口)持续运行而不被 php 默认的 60 秒超时中断。需注意 cli 与 web 环境差异及系统级防护机制。
Laravel 路由默认运行于 Web SAPI(如 Apache 或 Nginx + PHP-FPM)环境下,而这类环境对请求响应时间有严格约束:PHP 默认 max_execution_time = 30(或常见配置为 60),Web 服务器(如 Nginx 的 fastcgi_read_timeout、Apache 的 Timeout)及反向代理(如 Cloudflare)也会主动终止“长时间无响应”的连接。因此,仅靠 ini_set('max_execution_time', '10000000') 无法生效——因为该设置在 Web SAPI 下可能被服务器强制覆盖,且非零值仍存在理论上限。
✅ 正确做法是显式禁用时间限制:
// routes/web.php 或控制器方法中
Route::get('/running-service', function () {
// 关键:设为 0 表示无时间限制
ini_set('max_execution_time', '0');
// 可选:关闭输出缓冲,避免因响应未完成触发超时
if (function_exists('apache_get_modules') && in_array('mod_php', apache_get_modules())) {
@apache_setenv('no-gzip', 1);
@ini_set('zlib.output_compression', 'Off');
}
while (true) {
// 执行核心逻辑(例如轮询、心跳、数据采集等)
\Log::info('Service is running...', ['timestamp' => now()]);
// 必须加入 sleep,避免 CPU 100% 占用
sleep(5);
}
});⚠️ 重要注意事项:
- 不适用于生产 Web 环境:该方案违背 HTTP 请求-响应模型,会导致连接长期挂起,耗尽服务器 worker 进程/连接数,极易引发服务雪崩。Nginx 默认 fastcgi_read_timeout 60 会直接断连,即使 PHP 层未超时。
-
推荐替代方案:
- ✅ 使用 Laravel Task Scheduling + Artisan 命令(CLI 模式),通过 php artisan schedule:run 定期触发,天然无 Web 超时限制;
- ✅ 将长任务拆解为队列作业(php artisan queue:work),配合 Supervisor 守护进程保持常驻;
- ✅ 若确需 HTTP 接口触发后台服务,应返回即时响应(如 202 Accepted),再由异步进程接管后续逻辑。
- CLI 环境更合适:若必须“永远运行”,建议将逻辑移至 Artisan 命令,并用 php artisan serve:daemon(自定义命令)+ Supervisor 管理,而非暴露为 Web 路由。
总结:ini_set('max_execution_time', '0') 在技术上可行,但仅适合本地调试或特殊嵌入式场景;生产环境务必采用基于队列、计划任务或守护进程的异步架构,兼顾稳定性、可观测性与可伸缩性。











