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 裡面
