首页 > PHP > Laravel教程 队列

Laravel教程 队列

2025-03-01 14:04:47

上一章节说事件说到了队列,现在简单说说队列。在 Laravel 中,队列允许你将耗时的任务(如发送邮件、处理图像等)放到后台异步执行,从而提高应用程序的响应速度。以下是关于 Laravel 队列的详细教程:

1. 配置队列

Laravel 支持多种队列驱动,如 sync(同步,用于本地开发测试)、database(数据库)、redis 等。配置文件位于 config/queue.php

选择队列驱动

打开 config/queue.php 文件,找到 default 选项,将其设置为你想要使用的队列驱动。例如,使用 Redis 驱动:

'default' => env('QUEUE_CONNECTION', 'redis'),

配置 Redis 连接

如果你选择使用 Redis 驱动,确保在 .env 文件中配置了 Redis 连接信息:

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

2. 创建队列任务

使用 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...');
    }
}

3. 分发任务到队列

在控制器或其他服务中,你可以使用 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']);
    }
}

4. 运行队列监听器

任务分发到队列后,需要运行队列监听器来处理这些任务。使用以下 Artisan 命令启动队列监听器:

php artisan queue:work

该命令会持续运行,不断从队列中取出任务并执行。如果你希望队列监听器在后台运行,可以使用 supervisor 等进程管理工具。

5. 数据库队列驱动(可选)

如果你选择使用数据库队列驱动,需要先创建队列任务表:

php artisan queue:table
php artisan migrate

然后在 config/queue.php 中将 default 选项设置为 database

'default' => env('QUEUE_CONNECTION', 'database'),

6. 任务失败处理

如果任务执行失败,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);
    }
}

7. 任务优先级和延迟

优先级

你可以在分发任务时指定任务的优先级:

ProcessPodcast::dispatch()->onQueue('high');

然后在启动队列监听器时指定要处理的队列:

php artisan queue:work --queue=high,default

延迟

你可以延迟任务的执行时间:

ProcessPodcast::dispatch()->delay(now()->addMinutes(10));

通过以上步骤,你可以在 Laravel 中使用队列来处理耗时任务,提高应用程序的性能和响应速度。

 

 

使用 Ctrl+D 可将网站添加到书签
收藏网站
扫描二维码
关注早实习微信公众号
官方公众号
Top