Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124

在 Laravel 中,使用 Redis 作為 Queue Driver 並結合 Laravel Horizon 來監控與管理佇列工作(queue jobs)是非常常見也高效的做法。以下是完整的建置與使用流程:
laravel/horizoncomposer require laravel/horizonLaravel Horizon 依賴下面這兩個擴展來處理進程控制和管理,這對於它的佇列監控功能至關重要。
ext-posix (可移植操作系統接口)ext-pcntl (進程控制)ext-pcntl 和 ext-posix 擴展通常不支援 Windows 作業系統,因為 Windows 在進程管理方面與類 Unix/Linux 系統(如 Linux、macOS)有根本性的差異。Laravel Horizon 主要設計用於類 Unix/Linux 環境,這些擴展在這些環境Unix/Linux中是標準配置。
解決方式
composer require laravel/horizon --ignore-platform-req=ext-pcntl --ignore-platform-req=ext-posix在 windows 執行畫面如下

注意: 在windows環境中,雖然可以利用此方式安裝,但在執行時因為找不到 ext-pcntl & ext-posix ,依舊無法啟動
php artisan horizon:install這會產生:
config/horizon.php 設定檔HorizonServiceProvider 如下:
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Gate;
use Laravel\Horizon\Horizon;
use Laravel\Horizon\HorizonApplicationServiceProvider;
class HorizonServiceProvider extends HorizonApplicationServiceProvider
{
/**
* Bootstrap any application services.
*/
public function boot(): void
{
parent::boot();
// Horizon::routeSmsNotificationsTo('15556667777');
// Horizon::routeMailNotificationsTo('[email protected]');
// Horizon::routeSlackNotificationsTo('slack-webhook-url', '#channel');
}
/**
* Register the Horizon gate.
*
* This gate determines who can access Horizon in non-local environments.
*/
protected function gate(): void
{
Gate::define('viewHorizon', function ($user = null) {
return in_array(optional($user)->email, [
//
]);
});
}
}並在 bootstrap/providers 中加入此服務
<?php
return [
App\Providers\AppServiceProvider::class,
App\Providers\HorizonServiceProvider::class,
];.env 使用 Redis Queue在環境檔 .env 內容修改如下
QUEUE_CONNECTION=redis
REDIS_CLIENT=phpredis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379啟動與中止
php artisan horizon:status # 檢查 Horizon 狀態
php artisan horizon:pause # 暫停處理
php artisan horizon:continue # 繼續處理
php artisan horizon:terminate # 停止 HorizonLaravel Horizon 提供一個漂亮的網頁儀表板,預設網址為:
http://your-app.test/horizon可透過 routes/web.php 控制存取權限,例如只限登入使用者或特定角色。或是編輯 app/Providers/HorizonServiceProvider.php
use Laravel\Horizon\Horizon;
public function boot()
{
Horizon::auth(function ($request) {
return auth()->check() && auth()->user()->isAdmin(); // 自訂邏輯
});
}或是在 gate 中設定
/**
* Register the Horizon gate.
*
* This gate determines who can access Horizon in non-local environments.
*/
protected function gate(): void
{
Gate::define('viewHorizon', function (User $user) {
return in_array($user->email, [
'[email protected]',
]);
});
}建議在 production 環境使用 supervisor 或 systemd 管理 horizon 程序,確保它不會意外中斷。
Supervisor 設定範例:
sudo apt-get install supervisor建立 /etc/supervisor/conf.d/horizon.conf:(或是 /etc/supervisor/conf.d)
[program:horizon]
process_name=%(program_name)s
command=php /path-to-your-project/artisan horizon
autostart=true
autorestart=true
user=www-data
redirect_stderr=true
stdout_logfile=/path-to-your-project/storage/logs/horizon.log
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start horizonconfig/horizon.php 自訂不同 queue 的處理邏輯與 worker 數。tags() 方法以利追蹤。failed_jobs 表,可從 UI 重新執行。ext-pcntl 和 ext-posix 擴展通常不支援 Windows 作業系統,因為 Windows 在進程管理方面與類 Unix 系統(如 Linux、macOS)有根本性的差異。Laravel Horizon 主要設計用於類 Unix 環境,這些擴展在這些環境中是標準配置。
pcntl 和 posix 擴展是可用的。在啟用這些擴展(或轉移到 Linux 環境)之後,請再次嘗試安裝 Horizon:
composer require laravel/horizon現在 Composer 應該能夠找到與 PHP 8.3.20 和新啟用的擴展相容的 Laravel Horizon 版本。最新的版本 (v5.33.1) 應該能正常工作。