close
Laravel Horizon
Info
-
Laravel 之父 Taylor Otwell 製作,官方 Redis Queue 監控介面
-
Laracon US 2017 演示影片,推薦觀看,真的很神奇!
Installation
-
require PHP 7.1+, Redis
-
透過 Composer 安裝
composer require laravel/horizon
-
產生 UI 介面檔案
php artisan vendor:publish --provider="Laravel\Horizon\HorizonServiceProvider"
Setting
-
所有設定都在 config/horizon.php
- 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
-
改用 Horizon 管理 queue
php artisan horizon
-
修改 Supervisor 設定
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
-
重讀 Supervisor 設定
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-horizon:*
-
進入 https://project/horizon 即可看到監控介面
-
可以在 /app/Providers/AppServiceProvider.php 另外加入驗證,讓特定環境/IP/使用者才能看到監控介面
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
-
其他設定上的修改可以參考Deploying Horizon To Laravel Forge
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,
],
MISCONF Redis is configured to save RDB snapshots
-
造成這個錯誤的主要原因是因為記憶體不夠導致備份失敗,單純是錯誤提醒,並不影響 queue 的執行
-
網路上提供的解決方式有二種:
-
其實對 queue 來說執行完畢本來就會刪除,我覺得相關資料在執行時的備份不是很重要,所以最後決定採用第一種比較快速的解決方式
Reference
文章標籤
全站熱搜
留言列表