close

Laravel Horizon

Info

Installation

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:*
  • 可以在 /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

Reference

arrow
arrow
    文章標籤
    PHP Horizon Laravel
    全站熱搜

    danielhuang030 發表在 痞客邦 留言(0) 人氣()