隊列
隊列用於異步執行消耗時間多的工作,比如發送郵件等操作,好處是可以快速為客戶響應結果,具體處理異步后台的操作。
下面的操作使用高效的redis完成處理,所以需要安裝相應的擴展包
composer require "predis/predis:~1.0"
處理失敗任務
有時你的隊列任務會失敗。Laravel包含了一個便捷的方式指定任務會被最大嘗試的次數。在一個任務到達了它最大嘗試次數之后,它會被放入failed_jobs
表。要創建failed_jobs
表你可以使用queue:failed-table
命令:
php artisan queue:failed-table
php artisan migrate
創建任務
php artisan make:job TestJob
在生成的類中的handle
方法設置任務具體的動作,下面是一個簡單的示例。
protected $user;
public function __construction(User $user)
{
$this->user = $user;
}
public function handle()
{
sleep(6);
file_put_contents('a.php', var_export($this->user->toArray(), true));
}
分發任務
TestJob::dispatch(User::find(1));
隊列處理器
隊列處理器用於執行推送到隊列中的任務
php artisan queue:work
要使
queue:work
在后台運行需要使用下面的Supervisor
(生產環境必用)
Laravel隊列監控面板
Horizon提供了一個漂亮的儀表盤,並且可以通過代碼配置你的Laravel Redis隊列,同時能夠讓你輕松地監控你的隊列系統中諸任務吞吐量,運行時間和失敗任務等關鍵指標
安裝
composer require laravel/horizon
php artisan vendor:publish --provider="Laravel\Horizon\HorizonServiceProvider"
啟動執行任務監聽
只需要一條命令語句即可啟動隊列執行進程。如果修改了任何代碼需要重啟horizon
監聽(需要在Homestead系統中執行)
php artisan horizon
可以通過路由/horizon
以圖形界面查看任何狀態
Supervisor
Supervisor是一個進程控制系統,用於讓我們的隊列在后台運行,並自動維護進行,如果掛了就自動重啟。
修改配置文件
sudo vi /etc/supervisor/conf.d/laravel-worker.conf
內容如下
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /home/vagrant/Code/laravel-cms/artisan queue:work --sleep=3 --tries=3
autostart=true
autorestart=true
user=vagrant
numprocs=8
redirect_stderr=true
stdout_logfile=/home/vagrant/Code/laravel-cms/worker.log
注意command與stdout_logfile配置根據環境自行更改
運行
一次執行下面命令加載配置並運行Supervisor
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-worker:*
這樣我們就不需要執行
php artisan queue:work
命令了,交給Supervisor
自動維護吧。