close
1. 建立一個資料表來記住任務。
在 termina l輸入 php artisan queue:table 指令後可以在 " database/migrations/ " 目錄下看到下方檔案
在 termina 輸入 php artisan migrate 指令就會在 DB 建立一個 Jobs 的資料表
2.產生任務類別
在 termina 輸入 php artisan make:job JobName (JobName 用自己的任務名稱來代替),會將任務類別建立在 " app/Jobs/ " 目錄下。
3.編輯任務,我的測試任務是新建一筆 gallery 紀錄
<?php namespace App\Jobs; use App\gallery; use Illuminate\Bus\Queueable; use Illuminate\Queue\SerializesModels; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; class test implements ShouldQueue { use InteractsWithQueue, Queueable, SerializesModels; /** * Create a new job instance. * * @return void */ public function __construct() { } /** * Execute the job. * * @return void */ public function handle() { gallery::create(['product_id'=>2]); } }
4.將 job 推送到 queue中,這邊的範例是在 controller 觸發,當然也可以在 route 觸發。
在 Controller 開頭要先引用我們的任務
<?php namespace App\Http\Controllers; use App\Jobs\test; class AdminController extends Controller {
在 Controller 撰寫建立任務的 function,dispatch 是把任務推送到 Queue 的 function
<?php namespace App\Http\Controllers; use App\Jobs\test; class AdminController extends Controller {
到這邊大至上已經完成 Laravel Queue 的準備 ,還有最重要的一件是 “一定要開啟 Queue listen" ,被推送的 jobs 才會被執行,如果沒有開啟任務會擺放在 DB 的 Jobs 資料表中。
如何傳送變數到 queue Job?
1.編輯任務,我傳送了一個假的產品 ID ,並在 Insert 的時候給予參數值
<?php namespace App\Jobs; use App\gallery; use Illuminate\Bus\Queueable; use Illuminate\Queue\SerializesModels; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; class test implements ShouldQueue { use InteractsWithQueue, Queueable, SerializesModels; public $ProductId; /** * Create a new job instance. * * @return void */ public function __construct($product_id) { $this->ProductId = $product_id; } /** * Execute the job. * * @return void */ public function handle() { gallery::create([ 'product_id' => $this->ProductId ]); } }
2.編輯 Controller 的 function,在建立任務時給予參數
function test() { $job = new test(13); dispatch($job); }
3.開啟 queue:listen ( 重要 ),若有出現 Processed 代表任務已經被執行!
執行完成後可以在資料表中看到剛剛新增的記錄
任務也可以分類!如何把任務推送到指定的對列?
1.編輯 Controller 的 function,在建立任務的時候加入 onQueue 可以指定要被推送的對列。
function test() { $job = (new test(13))->onQueue('cool'); dispatch($job); }
2.在這邊展示一下如果不開啟 queue:listen,任務會保留在 Jobs 資料表中,因為我們有指定對列名稱為 cool 所以 queue 欄位值為 cool。( 一般不指定對列名稱的情況下 queue 的欄位值為 defalut )
3.這邊有一個要注意的地方,因為我們在建立任務的時候有指定對列名稱,所以在 queue listen 的時候也要給予相對應的名稱,當我們執行 listen 的時候在 Jobs 中等待的任務就會馬上被執行。
如何將任務延遲執行?
1.編輯 Controller 的 function,在建立任務的時候加入 delay 功能可以延遲任務執行,參數以秒為單位,在這邊範例為延遲 1 分鐘。
function test() { $job = (new test(13))->delay(60 * 1); dispatch($job); }
queue listen 參數列表
範例:
–timeout=60 設定每個任務所被允許執行的時間長度,這邊設為60 秒。
–sleep=5 指定隊列要等5秒再拿取新的任務來執行。
※ 備註
一開始要編輯 .env檔案
把 QUEUE_DRIVER=sync 改成 QUEUE_DRIVER=database
才會啟動Queue功能,把排程寫到資料庫的jobs table 裡面
文章標籤
全站熱搜
留言列表