本文目录导读:

在 Laravel 中,可以使用 set_time_limit(),但具体使用方式取决于你的场景:
普通 PHP 脚本/路由中 ✅ 可以直接使用
// 在控制器或自定义脚本中 set_time_limit(300); // 300秒 = 5分钟 // 或 set_time_limit(0); // 无限制(不推荐生产环境)
Artisan 命令中 ⚠️ 需要注意
Laravel Artisan 命令默认不受 set_time_limit() 影响,需要使用命令类中的 $timeout 属性:
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
class ProcessData extends Command
{
protected $signature = 'data:process';
protected $description = '处理数据';
// ★ 设置超时时间(秒)
protected $timeout = 300; // 5分钟
// 设为 null 表示无限制
// protected $timeout = null;
public function handle()
{
// 你的耗时逻辑...
}
}
队列任务中 🎯 推荐方式
class ProcessPodcast implements ShouldQueue
{
public $timeout = 300; // 5分钟超时
public $tries = 3; // 失败重试次数
public function handle()
{
// 耗时任务...
}
}
不同场景的最佳实践
| 场景 | 推荐做法 |
|---|---|
| HTTP 请求(短任务) | 使用 set_time_limit(30) |
| 导出/报表(长任务) | 使用队列 + $timeout 属性 |
| 定时任务 | 使用 Artisan 命令 + $timeout 属性 |
| 文件处理 | 使用队列处理,避免阻塞请求 |
完整示例:队列处理超大Excel
// app/Jobs/ExportReport.php
class ExportReport implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public $timeout = 600; // 10分钟
public $tries = 2;
public $backoff = 60; // 失败后60秒重试
public function handle()
{
// 处理大数据导出
Excel::store(new ReportExport, 'reports/large.xlsx');
}
}
- 简单场景:直接用
set_time_limit() - 生产环境:优先使用队列 + 任务属性配置超时
- Artisan 命令:使用
$timeout属性 - 避免:在生产环境使用
set_time_limit(0)(无限超时)
最佳实践:对于可能长时间运行的任务,始终使用队列处理,这样 Web 请求不会超时,也更容易管理和监控。