1.修改ENV文件 設置隊列使用database
QUEUE_CONNECTION=database
2.創(chuàng)建隊列所需要的數(shù)據(jù)庫表(表的名稱是根據(jù)config/queue.php文件的設置來的,默認為jobs)
> php artisan queue:table//生成遷移文件
> php artisan migrate//執(zhí)行遷移文件
3.創(chuàng)建一個隊列任務(此例為Sendemail)
> php artisan make:job Sendemail
4.定義隊列任務(此例我們寫入一個Log日志,
是不是很意外?名字叫sendemail,干的是寫入日志的活..)
//sendemail.php
public function handle()
{
Log::alert('隊列測試');
}
5.控制器中定義一個方法調(diào)用隊列
如果在模型中使用需要use Illuminate\Foundation\Bus\DispatchesJobs;
//controller
public function queue()
{
Sendemail::dispatch();
}
此時訪問這個方法可以在數(shù)據(jù)表 jobs中看到隊列已經(jīng)創(chuàng)建,此時隊列是沒有執(zhí)行的
6.運行隊列監(jiān)聽器執(zhí)行隊列
> php artisan queue:listen
此時收到隊列執(zhí)行完成的提示,在App/storage/logs/下面找到今天的日志文件,并查看可以找到下列內(nèi)容,這就是隊列執(zhí)行的工作
[2019-07-15 03:09:47] local.ALERT: 隊列測試
失敗隊列處理
1.創(chuàng)建失敗表的遷移文件和執(zhí)行遷移文件
> php artisan queue:failed-table
> php artisan migrate
2.我們修改控制器方法人為的制造一個錯誤
為隊列設置重試次數(shù),這里為3次.
> php artisan queue:work --tries=3
也可以在隊列文件中定義重試次數(shù)[優(yōu)先級高于命令行]
public $tries=5;
//定義隊列超時時間,單位為秒.
public $timeout = 120;
//隊列分類名稱
public $queue='mail';
執(zhí)行監(jiān)聽> php artisan queue:listen
此時執(zhí)行失敗的隊列已經(jīng)自動記錄在表failed_jobs里面
查看失敗的隊列
> php artisan queue:failed
此時會列出失敗的隊列列表
重新開始執(zhí)行隊列命令> php artisan queue:retry 1表示重新執(zhí)行ID為1的隊列任務
如果要執(zhí)行所有失敗的隊列> php artisan queue:retry all
刪除失敗的隊列命令> php artisan queue:forget 1
刪除所有失敗隊列命令> php artisan queue:flush
我們可以定義一下隊列失敗的動作
//Sendemail.php
public function failed()
使用`failed`方法定義隊列失敗的處理方法,比如發(fā)送短信或者郵件給管理員.
{
Log::alert('隊列失敗了,通知一下');
}
任務類結構隊列
- 這是一種簡單的隊列用法
在控制器類名后面加上implements ShouldQueue
use Illuminate\Contracts\Queue\ShouldQueue;
class TableController extends Controller implements ShouldQueue
{
//隊列自動重試次數(shù)
public $tries=5;
//隊列分類名稱
public $queue='mail';
public function sendemail()
{
$data = ['email' => '66666666@qq.com'];
Mail::to($data)->queue(new Welcome('管理員'));
}
}