Laravel Horizon
Info
Installation
-
require PHP 7.1+, Redis
-
-
透過 Composer 安裝
composer require laravel/horizon
php artisan vendor:publish --provider="Laravel\Horizon\HorizonServiceProvider"
Setting
- config/horizon.php
-
return [
// 使用連線名稱,對應 config/database.php Redis 的連線設定值,建議用一個獨立的連線設定 e.g. horizon
'use' => 'horizon',
// 在 Redis 中的前置詞,使用預設
'prefix' => env('HORIZON_PREFIX', 'horizon:'),
// 程式執行過久的時間設定(單位:秒),似乎與通知有關;沒有用到,使用預設
'waits' => [
'redis:default' => 60,
],
// 在 Laravel Horizon 介面中 "Recent Jobs" 與 "Failed" 資料存活時間(單位:分),使用預設
'trim' => [
'recent' => 60,
'failed' => 10080,
],
// 重要環境設定
'environments' => [
// production 環境
'production' => [
// 相當於之前在 supervisor 中的設定
'supervisor-test' => [
// queue 連線使用 redis,,對應 config/queue.php Redis 的設定值,使用預設
'connection' => 'redis',
// queue 名稱列表,如果沒有使用 balance 會依照順序執行:queue1 > queue2 > queue3
'queue' => ['queue1', 'queue2', 'queue3'],
// 平衡設定:false(不使用), 'simple'(平均), 'auto'(自動調整,會給比較忙的 queue 多一點 worker)
'balance' => false,
// worker 數
'processes' => 1,
// 重試次數
'tries' => 3,
],
'supervisor-balance' => [
'connection' => 'redis',
// queue4 = queue5, worker 數自動分配
'queue' => ['queue4', 'queue5'],
// 自動調整
'balance' => 'auto',
'processes' => 10,
'tries' => 3,
],
],
// local 本機環境
'local' => [
'supervisor-test' => [
'connection' => 'redis',
'queue' => ['queue1', 'queue2', 'queue3'],
'balance' => false,
'processes' => 1,
'tries' => 3,
],
'supervisor-balance' => [
'connection' => 'redis',
'queue' => ['queue4', 'queue5'],
'balance' => 'auto',
'processes' => 10,
'tries' => 3,
],
],
],
];
Usage
php artisan horizon
sudo vi /etc/supervisor/conf.d/laravel-worker.conf
- /etc/supervisor/conf.d/laravel-worker.conf
-
[program:laravel-horizon]
process_name=%(program_name)s
command=php /var/www/project/artisan horizon
autostart=true
autorestart=true
user=root
redirect_stderr=true
stdout_logfile=/var/www/project/storage/logs/horizon.log
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-horizon:*
public function boot()
{
// ...
// horizon authentication
Horizon::auth(function(Request $request) {
return ($this->app->environment('local') || in_array($request->ip(), ['xxx.xxx.xxx.xxx']) || auth()->guard('admin')->check());
});
}
Deploying
-
因為現在改由 Horizon 管理 queue,之前使用的
php artisan queue:restart
要修改成
php artisan horizon:terminate
-
Trouble Shooting
Monitor Tag 送出沒有反應
-
因為被 middleware VerifyCsrfToken 擋下來,可以參考
這邊的做法忽略
protected $except = [
// ...
'horizon/*',
];
Jobs 憑空消失
-
不確定是不是 bug,但
這邊提供設定似乎可以解決,在 config/queue.php Redis 的連線設定中加入參數
'redis' => [
'driver' => 'redis',
'connection' => 'queue',
'queue' => 'default',
'retry_after' => 90,
// 加入此設定
'block_for' => null,
],
Reference
-