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 裡面
arrow
arrow
    文章標籤
    queue job Laravel
    全站熱搜

    Mayuge 發表在 痞客邦 留言(0) 人氣()