* * * * *
[TOC]
## 介紹
Horizon 提供了一個漂亮的儀表盤,并且可以通過代碼配置你的 Laravel Redis 隊列,同時能夠讓你輕松地監控你的隊列系統中諸如任務吞吐量,運行時間和失敗任務等關鍵指標。
所有配置項都存放在一個簡單的配置文件中,應當把它放進團隊能夠協同維護的版本控制中。
## 安裝
> {note} 由于 Horizon 中用了異步處理信號,所以安裝擴展包需要 PHP 環境在 7.1 以上。
你應該用 Composer 包管理工具來給你的 Laravel 項目安裝 Horizon。
~~~
composer require laravel/horizon
~~~
安裝完成后,使用 Artisan 命令來發布它的相關文件:
~~~
php artisan vendor:publish --provider="Laravel\Horizon\HorizonServiceProvider"
~~~
### 配置
發布 Horizon 的相關文件后,它的主要配置文件會放在?`config/horizon.php`. 你可以在這個文件中配置隊列工作進程相關的選項,并且每個配置項都有詳細的使用說明,所以請詳細的閱讀此文件。
#### 負載均衡配置
Horizon 提供了三種均衡策略:?`simple`,?`auto`, 和?`false`。默認策略是?`simple`,會將接收到的任務均分給隊列進程:
~~~
'balance' => 'simple',
~~~
`auto`?策略會根據當前的工作量調整每個隊列的工作進程任務數量。例如:如果?`notifications`?隊列有 1000 個待執行任務,但是你的?`render`?隊列是空的,Horizon 會分配更多工作進程給?`notifications`?隊列,直到?`notifications`?隊列中所有任務執行。當配置項?`balance`?設置為?`false`?時,Horizon 會使用 Laravel 默認執行行為,它將按照配置中列出的順序處理隊列任務。
### 儀表盤權限驗證
Horizon 儀表盤的路由是?`/horizon`。默認情況下,你只能在?`local`?環境中訪問儀表盤。我們可以使用`Horizon::auth`?方法給儀表盤定義更具體的訪問策略。?`auth`?方法接受一個回調函數作為參數,該回調函數應當返回?`true`?或?`false`?以確認用戶是否有權限訪問儀表盤。通常情況下你應當在?`AppServiceProvider`?的?`boot`?方法中調用:
~~~
Horizon::auth(function ($request) {
// return true / false;
});
~~~
## 運行 Horizon
當你在?`config/horizon.php`?文件中配置好了你的隊列執行進程后,你就可以用?`horizon`?Artisan 命令啟動你的 Horizon。只需一條命令語句即可啟動所有配置好的隊列執行進程。
~~~
php artisan horizon
~~~
你也可以用?`horizon:pause`?和?`horizon:continue`?Artisan 命令來暫停或繼續執行隊列任務。:
~~~
php artisan horizon:pause
php artisan horizon:continue
~~~
用?`horizon:terminate`?Artisan 命令可以優雅的終止 Horizon 主進程。Horizon 會在把正在執行的所有任務處理完畢后退出:
~~~
php artisan horizon:terminate
~~~
### 部署 Horizon
如果你將 Horizon 部署到線上服務器時,則需要配置一個進程監控器來監測?`php artisan horizon`?命令,在它意外退出時自動重啟。上線新代碼時則需要該進程監控器終止 Horizon 進程并以修改后的代碼重啟 Horizon。
#### Supervisor 配置
如果你使用 Supervisor 進程監控器管理你的?`horizon`?進程,那么以下配置文件則可以滿足需求。
~~~
[program:horizon]
process_name=%(program_name)s
command=php /home/forge/app.com/artisan horizon
autostart=true
autorestart=true
user=forge
redirect_stderr=true
stdout_logfile=/home/forge/app.com/horizon.log
~~~
> {tip} 如果你不喜歡自己維護服務器,可以考慮使用 Laravel Forge ,Forge 提供了運行一個帶有 Horizon 的現代、強大的 Laravel 應用所需的 PHP7+ 以及其他所有環境。
## 標簽
你可以在 Horizon 中給任務分配 「標簽」,包括郵件,事件廣播,通知和隊列化的事件監聽器。事實上,Horizon 會智能并且自動根據任務攜帶的 Eloquent 模型給大多數任務標記標簽,如下任務示例:
~~~
<?php
namespace App\Jobs;
use App\Video;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
class RenderVideo implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* The video instance.
*
* @var \App\Video
*/
public $video;
/**
* Create a new job instance.
*
* @param \App\Video $video
* @return void
*/
public function __construct(Video $video)
{
$this->video = $video;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
//
}
}
~~~
如果該隊列任務攜帶了一個?`id`?為?`1`?的?`App\Video`?實例,那么它將被標記上?`App\Video:1`?標簽。因為 Horizon 會檢查任務屬性是否有 Eloquent 模型,如果發現 Eloquent 模型,Horizon將會智能的用該模型的類名和主鍵為任務標記上標簽。
~~~
$video = App\Video::find(1);
App\Jobs\RenderVideo::dispatch($video);
~~~
#### 自定義標簽
如果你想手動的為可隊列執行的對象定義標簽,你可以給這個類定義一個?`tags`?方法:
~~~
class RenderVideo implements ShouldQueue
{
/**
* Get the tags that should be assigned to the job.
*
* @return array
*/
public function tags()
{
return ['render', 'video:'.$this->video->id];
}
}
~~~
## 通知
> **Note:**?在使用通知之前,你應該為你的項目添加?`guzzlehttp/guzzle`?Composer 包。在使用 Horizon 配置發送短信通知時,你還需要閱讀?[Nexmo 通知驅動的依賴條件](https://laravel-china.org/docs/laravel/5.5/notifications#sms-notifications)?章節。
如果需要在隊列等待時間過長時發起通知,可以在應用的?`AppServiceProvider`?中調用?`Horizon::routeMailNotificationsTo`,?`Horizon::routeSlackNotificationsTo`,和?`Horizon::routeSmsNotificationsTo`?方法 :
~~~
Horizon::routeMailNotificationsTo('example@example.com');
Horizon::routeSlackNotificationsTo('slack-webhook-url', '#channel');
Horizon::routeSmsNotificationsTo('15556667777');
~~~
#### 配置等待時間過長通知的閾值
你可以在?`config/horizon.php`?文件中配置等待時間過長具體秒數,?`waits`?配置項可以針對每個 鏈接/隊列 配置閾值:
~~~
'waits' => [
'redis:default' => 60,
],
~~~
## Metrics
Horizon 包含一個 metrics 儀表盤,它可以提供任務和隊列等待時間和吞吐量信息,為了填充此儀表盤,需要使用應用的?[scheduler](http://www.hmoore.net/tonyyu/laravel_5_6/786249)?每五分鐘運行一次 Horizon 的 Artisan 命令?`snapshot`:
~~~
/**
* Define the application's command schedule.
*
* @param \Illuminate\Console\Scheduling\Schedule $schedule
* @return void
*/
protected function schedule(Schedule $schedule)
{
$schedule->command('horizon:snapshot')->everyFiveMinutes();
}
~~~
- 前言
- 翻譯說明
- 發行說明
- 升級指南
- 貢獻導引
- 入門指南
- 安裝
- 配置信息
- 文件夾結構
- Homestead
- Valet
- 部署
- 核心架構
- 請求周期
- 服務容器
- 服務提供者
- Facades
- Contracts
- 基礎功能
- 路由
- 中間件
- CSRF 保護
- 控制器
- 請求
- 響應
- 視圖
- URL
- Session
- 表單驗證
- 錯誤
- 日志
- 前端開發
- Blade 模板
- 本地化
- 前端指南
- 編輯資源 Mix
- 安全相關
- 用戶認證
- Passport OAuth 認證
- 用戶授權
- 加密解密
- 哈希
- 重置密碼
- 綜合話題
- Artisan 命令行
- 廣播系統
- 緩存系統
- 集合
- 事件系統
- 文件存儲
- 輔助函數
- 郵件發送
- 消息通知
- 擴展包開發
- 隊列
- 任務調度
- 數據庫
- 快速入門
- 查詢構造器
- 分頁
- 數據庫遷移
- 數據填充
- Redis
- Eloquent ORM
- 快速入門
- 模型關聯
- Eloquent 集合
- 修改器
- API 資源
- 序列化
- 測試相關
- 快速入門
- HTTP 測試
- 瀏覽器測試 Dusk
- 數據庫測試
- 測試模擬器
- 官方擴展包
- Cashier 交易工具包
- Envoy 部署工具
- Horizon
- Scout 全文搜索
- Socialite 社會化登錄