上一章节说事件说到了队列,现在简单说说队列。在 Laravel 中,队列允许你将耗时的任务(如发送邮件、处理图像等)放到后台异步执行,从而提高应用程序的响应速度。以下是关于 Laravel 队列的详细教程:
Laravel 支持多种队列驱动,如 sync
(同步,用于本地开发测试)、database
(数据库)、redis
等。配置文件位于 config/queue.php
。
打开 config/queue.php
文件,找到 default
选项,将其设置为你想要使用的队列驱动。例如,使用 Redis 驱动:
'default' => env('QUEUE_CONNECTION', 'redis'),
如果你选择使用 Redis 驱动,确保在 .env
文件中配置了 Redis 连接信息:
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
使用 Artisan 命令创建一个新的队列任务:
php artisan make:job ProcessPodcast
这将在 app/Jobs
目录下创建一个 ProcessPodcast.php
文件。打开该文件,你可以看到 handle
方法,该方法包含任务的具体逻辑:
<?php
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
class ProcessPodcast implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
// 这里编写任务的具体逻辑
// 例如,发送邮件、处理图像等
info('Podcast processing...');
}
}
在控制器或其他服务中,你可以使用 dispatch
方法将任务分发到队列:
<?php
namespace App\Http\Controllers;
use App\Jobs\ProcessPodcast;
use Illuminate\Http\Request;
class PodcastController extends Controller
{
public function store(Request $request)
{
// 分发任务到队列
ProcessPodcast::dispatch();
return response()->json(['message' => 'Podcast processing queued']);
}
}
任务分发到队列后,需要运行队列监听器来处理这些任务。使用以下 Artisan 命令启动队列监听器:
php artisan queue:work
该命令会持续运行,不断从队列中取出任务并执行。如果你希望队列监听器在后台运行,可以使用 supervisor
等进程管理工具。
如果你选择使用数据库队列驱动,需要先创建队列任务表:
php artisan queue:table
php artisan migrate
然后在 config/queue.php
中将 default
选项设置为 database
:
'default' => env('QUEUE_CONNECTION', 'database'),
如果任务执行失败,Laravel 会自动重试一定次数(默认 3 次)。你可以在任务类中定义 failed
方法来处理任务失败的情况:
<?php
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
class ProcessPodcast implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
// ...
/**
* Handle a job failure.
*
* @param \Throwable $exception
* @return void
*/
public function failed(\Throwable $exception)
{
// 记录失败日志或发送通知
report($exception);
}
}
你可以在分发任务时指定任务的优先级:
ProcessPodcast::dispatch()->onQueue('high');
然后在启动队列监听器时指定要处理的队列:
php artisan queue:work --queue=high,default
你可以延迟任务的执行时间:
ProcessPodcast::dispatch()->delay(now()->addMinutes(10));
通过以上步骤,你可以在 Laravel 中使用队列来处理耗时任务,提高应用程序的性能和响应速度。