laravel 佇列是什麼

2022-02-14 16:00:35

在laravel中,佇列是一種操作受限制的線性表,它只允許在表的前端(隊頭)進行刪除操作,而在表的後端(隊尾)進行插入操作;通過佇列,開發者可以將耗時任務的處理往後推延,進而可以極大地提升web請求響應速度。

本教學操作環境:windows7系統、Laravel6版、Dell G3電腦。

laravel中佇列的使用

1、什麼是佇列

佇列是一種操作受限制的線性表,特殊之處在於它只允許在表的前端進行刪除操作,而在表的後端進行插入操作。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。

通過佇列,你可以將耗時任務 (如傳送電子郵件) 的處理往後推延。延遲這些耗時的任務可以極大地提升 web 請求響應速度。

2、優點

  • 解耦:訊息佇列可以對系統進行解耦,提高響應速度,系統功能向內聚合,對外開放;

  • 非同步:訊息佇列可以對系統非同步功能進行剝離,減少功能耦合,提供開發效率;

  • 削峰:訊息佇列可以削峰限流,確保下游消費者穩定執行;

3、設定

佇列組態檔儲存在 config/queue.php 中。 在這個檔案中,你可以找到框架中包含的每個佇列驅動程式的連線設定,其中包括資料庫,Beanstalkd,Amazon SQS,Redis,和一個同步驅動程式(sync-供本地使用)。
這裡使用 Redis 作為驅動,需要安裝好 Redis 以及 相關擴充套件。

4、任務

我們需要把一些東西放入佇列中,我們可以稱之為任務。Laravel 框架中建立任務給我們提供了以下命令:

php artisan make:job TestJob

TestJob.php

namespace App\Jobs;use Illuminate\Bus\Queueable;use Illuminate\Contracts\Queue\ShouldBeUnique;use Illuminate\Contracts\Queue\ShouldQueue;use Illuminate\Foundation\Bus\Dispatchable;use Illuminate\Queue\InteractsWithQueue;use Illuminate\Queue\SerializesModels;use Illuminate\Support\Facades\DB;use Symfony\Polyfill\Intl\Idn\Info;class TestJob 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()
    {//        \Log::info('hhh');
        DB::connection('test')
            ->table('master')
            ->insert([
                'name'=>'小白',
                'email'=>'[email protected]'
            ]);
    }}

5、分發

一旦編寫了任務類,就可以使用任務本身的 dispatch 方法來分派它。傳遞給 dispatch 方法的引數將被傳遞給任務的建構函式。

onQueue: 指定佇列;
onConnection: 指定連線;
delay: 延遲佇列;
dispatchNow: 同步排程;

#在路由中簡單呼叫
Route::get('queue',function(){
        \App\Jobs\TestJob::dispatch();
//        \App\Jobs\TestJob::dispatch()->onQueue('qq');
    });

執行兩次該路由可以看到生成一個名為qq的佇列,後面我們對佇列進行消費

1.webp.jpg

6、佇列消費

Laravel 有一個佇列處理器對新推入佇列的任務進行處理。通過 Artisan 命令 queue:work 來啟動佇列處理器。需要注意的是,一旦 queue:work 命令啟動,將一直保持執行,直到它被手動停止或你關閉你的終端:

php artisan queue:work
php artisan queue:work --once 新增引數,消費指定佇列

#消費qq佇列
php artisan queue:work --queue=qq

可以看到資料庫中新增了兩條資料,並且redis中資料被消費

2.webp.jpg

3.webp.jpg

我們再次執行路由

4.png

7、事件佇列

佇列通常是用來處理延遲任務,事件是業務邏輯處理。Laravel 中的 事件 觸發器分發至佇列中進行非同步業務處理,那麼這樣之後可以快速做出響應而不用實時等待執行結果之後才能給使用者做出提示訊息。
如果需要把事件中的業務存放到佇列中去,我們並不需要重新進行佇列的分發,直接在對應的監聽器中實現 Illuminate\Contracts\Queue\ShouldQueue 介面即可。

建立事件和監聽器

php artisan make:event TestEvent
php artisan make:listener TestListener

在app\providers\EventServiceProvider.php中註冊

5.webp.jpg

TestListener.php

namespace App\Listeners;

use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Support\Facades\DB;

class TestListener implements ShouldQueue
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  object  $event
     * @return void
     */
    public function handle()
    {
        DB::connection('test')
            ->table('master')
            ->insert([
                'name'=>'小黑',
                'email'=>'[email protected]'
            ]);
    }
}

修改路由

Route::get('queue',function(){
        //\App\Jobs\TestJob::dispatch();
        //指定佇列名稱
        //\App\Jobs\TestJob::dispatch()->onQueue('qq');
        return event(new \App\Events\TestEvent());
    });

執行路由

6.webp.jpg

消費佇列

php artisan queue:work

7.webp.jpg

【相關推薦:】

以上就是laravel 佇列是什麼的詳細內容,更多請關注TW511.COM其它相關文章!