在laravel中,佇列是一種操作受限制的線性表,它只允許在表的前端(隊頭)進行刪除操作,而在表的後端(隊尾)進行插入操作;透過佇列,開發者可以將耗時任務的處理往後推延,進而可以大幅提升web請求回應速度。
本教學操作環境:windows7系統、Laravel6版、Dell G3電腦。
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'=>'123@qq.com' ]); }}
5、分發
##一旦編寫了任務類,就可以使用任務本身的dispatch 方法來分派它。傳遞給 dispatch 方法的參數將會傳遞給任務的建構子。
onQueue: 指定佇列;
onConnection: 指定佇列;onConnection: 指定連線;
delay: 延遲佇列;dispatchNow: 延遲佇列;dispatchNow: 延遲佇列;
dispatchNow: 1 次該路由可以看到產生一個名為qq的佇列,後面我們對佇列進行消費 6、佇列消費Laravel 有一個佇列處理器對新推入佇列的任務進行處理。透過 Artisan 指令 queue:work 來啟動佇列處理器。需要注意的是,一旦queue:work 命令啟動,將保持運行,直到它被手動停止或你關閉你的終端:php artisan queue:workphp artisan queue: work --once 新增參數,消費指定佇列
####在路由中简单调用 Route::get('queue',function(){ \App\Jobs\TestJob::dispatch(); // \App\Jobs\TestJob::dispatch()->onQueue('qq'); });###可以看到資料庫中新增了兩個數據,並且redis中資料被消費############ ############我們再次執行路由######################7、事件佇列######### ###佇列通常是用來處理延遲任務,事件是業務邏輯處理。 Laravel 中的 事件 觸發器會分發至佇列中進行非同步業務處理,那麼這樣之後可以快速回應而不用即時等待執行結果之後才能給使用者做出提示訊息。 ###如果需要把事件中的業務存放到佇列中去,我們並不需要重新進行佇列的分發,直接在對應的監聽器中實作 Illuminate\Contracts\Queue\ShouldQueue 介面即可。 ######建立事件和監聽器###
#消费qq队列 php artisan queue:work --queue=qq###在app\providers\EventServiceProvider.php中註冊##############TestListener.php###
php artisan make:event TestEvent php artisan make:listener TestListener###修改路由###
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'=>'234@qq.com' ]); } }###運行路由################消費佇列###
Route::get('queue',function(){ //\App\Jobs\TestJob::dispatch(); //指定队列名称 //\App\Jobs\TestJob::dispatch()->onQueue('qq'); return event(new \App\Events\TestEvent()); });#########
【相關推薦:laravel影片教學】
以上是laravel 隊列是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!