【相關推薦:】
本文將介紹如何在 Laravel 中使用佇列,以及瞭解了為什麼使用佇列
耗時的,比如上傳一個檔案後進行一些格式的轉化等。
需要保證送達率的,比如傳送簡訊,因為要呼叫別人的 api,總會有機率失敗,那麼為了保證送達,重試就必不可少了。
記錄使用過程:
佇列組態檔存放在 config/queue.php,預設為 sync 同步處理,這裡可以選擇 redis,database 等,使用方法如下。
資料庫
建立資料表儲存任務,執行完 artisan 命令後執行資料遷移
php artisan queue:table php artisan migrate
Redis
為了使用 redis 佇列驅動,你需要在你的組態檔 config/database.php 中設定Redis的資料庫連線。
如果你的 Redis 佇列連線使用的是 Redis 叢集,你的佇列名稱必須包含 key hash tag。這是為了確保所有的 Redis 鍵對於一個給定的佇列都置於同一雜湊中:
'redis' => [ 'driver' => 'redis', 'connection' => 'default', 'queue' => 'default', 'retry_after' => 90, ],
佇列的任務類在 app/Jobs/ 目錄下
php artisan make:job SaveBusLine
修改檔案如下:
namespace App\Jobs; use App\Http\Repository\BusRepository; use Illuminate\Bus\Queueable; use Illuminate\Queue\SerializesModels; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; class SaveBusLine implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; /** * 任務最大嘗試次數。 * * @var int */ public $tries = 3; /** * 任務執行的超時時間。 * * @var int */ public $timeout = 60; private $datum; /** * Create a new job instance. * @param array|object $datum * * @return void */ public function __construct($datum) { $this->datum = $datum; } /** * Execute the job. * * @return void */ public function handle() { BusRepository::getInstent()->updateBusLine($this->datum); } }
在控制器或倉庫中呼叫佇列方法:
use App\Jobs\SaveBusLine; use Carbon\Carbon; /***************** 佇列操作 start *******************/ SaveBusLine::dispatch($arrayData)->delay(Carbon::now()->addMinute(1)); /***************** 佇列操作 end *******************/
php artisan queue:work
安裝 Supervisor
Supervisor 是一個 Linux 作業系統上的程序監控軟體,它會在 queue:listen 或 queue:work 命令發生失敗後自動重新啟動它們。在 Ubuntu 安裝 Supervisor,可以用以下命令:
sudo apt-get install supervisor
{tip} 如果自己手動設定 Supervisor 聽起來有點難以應付,可以考慮使用 Laravel Forge,它能給你的 Laravel 專案自動安裝與設定 Supervisor。
設定 Supervisor
Supervisor 的組態檔一般是放在 /etc/supervisor/conf.d 目錄下。在這個目錄中你可以建立任意數量的組態檔來要求 Supervisor 怎樣監控你的程序。例如我們建立一個 laravel-worker.conf 來啟動與監控一個 queue:work 程序:
[program:laravel-worker] process_name=%(program_name)s_%(process_num)02d command=php ~/laravel/artisan queue:work redis --sleep=3 --tries=3 autostart=true autorestart=true user=lisgroup numprocs=8 redirect_stderr=true stdout_logfile=/home/lisgroup/logs/worker.log
這個例子裡的 numprocs 命令會要求 Supervisor 執行並監控 8 個 queue:work 程序,並且在它們執行失敗後重新啟動。當然,你必須更改 command 命令的 queue:work redis ,以顯示你所選擇的佇列驅動。還需要修改執行的使用者 user=XXX
啟動 Supervisor
當這個組態檔被建立後,你需要更新 Supervisor 的設定,並用以下命令來啟動該程序:
sudo supervisorctl reread sudo supervisorctl update sudo supervisorctl start laravel-worker:*
更多有關 Supervisor 的設定與使用,請參考 Supervisor 官方檔案。
有時候你佇列中的任務會失敗。不要擔心,本來事情就不會一帆風順。Laravel 內建了一個方便的方式來指定任務重試的最大次數。當任務超出這個重試次數後,它就會被插入到 failed_jobs 資料表裡面。要建立 failed_jobs 表的遷移檔案,你可以用 queue:failed-table 命令,接著使用 migrate Artisan 命令生成 failed_jobs 表:
php artisan queue:failed-table php artisan migrate
然後執行佇列處理器,在呼叫 queue worker,命令時你應該通過 --tries 引數指定任務的最大重試次數。如果不指定,任務就會永久重試:
php artisan queue:work redis --tries=3
你可以在任務類裡直接定義 failed 方法,它能在任務失敗時執行任務的清除邏輯。這個地方用來發一條警告給使用者或者重置任務執行的操作等再好不過了。導致任務失敗的異常資訊會被傳遞到 failed 方法:
namespace App\Jobs; use Exception; use App\Podcast; use App\AudioProcessor; use Illuminate\Bus\Queueable; use Illuminate\Queue\SerializesModels; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; class ProcessPodcast implements ShouldQueue { use InteractsWithQueue, Queueable, SerializesModels; protected $podcast; /** * 建立一個新的任務範例。 * * @param Podcast $podcast * @return void */ public function __construct(Podcast $podcast) { $this->podcast = $podcast; } /** * 執行任務。 * * @param AudioProcessor $processor * @return void */ public function handle(AudioProcessor $processor) { // 處理上傳播客... } /** * 要處理的失敗任務。 * * @param Exception $exception * @return void */ public function failed(Exception $exception) { // 給使用者傳送失敗通知,等等... } }
【相關推薦:】
以上就是範例講解Laravel佇列的簡單使用的詳細內容,更多請關注TW511.COM其它相關文章!