版本5.6,php7.2,redis3
要求
由于 Horizon 使用了异步进程信号,所以 PHP 7.1+ 以上版本才可以使用。
安装
composer require laravel/horizon
vendor:publish 发布前端资源
php artisan vendor:publish --provider="Laravel\Horizon\HorizonServiceProvider"
生成config/horizon.php
balance 配置项
负载均衡策略
simple、auto 和 false
simple 是默认策略
打开浏览器
你的访问地址/horizon
比如
http://192.168.91.130:85/horizon/
设置权限访问
例子
app/Provides/AppServiceProvider.php
比如我这里必须前面带名字为kongqi才可以访问,现实中,你需要写权限,比如认证之后的用户。
<?php
namespace App\Providers;
use Illuminate\Http\Request;
use Laravel\Horizon\Horizon;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot(Request $request)
{
//
Horizon::auth(function ($request) {
// return true / false;
if($request->name=='kongqi')
{
return true;
}
});
}
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
}
这个时候,不写任何参数,访问
http://192.168.91.130:85/horizon/dashboard
image.png
带参数
http://192.168.91.130:85/horizon/dashboard?name=kongqi
image.png
现在还没开启
运行 Horizon
php artisan horizon
比如我后台执行
php artisan horizon &
暂停或继续处理队列任务
php artisan horizon:pause
php artisan horizon:continue
地终止 Horizon 主进程
php artisan horizon:terminate
Supervisor 配置
[program:horizon]
process_name=%(program_name)s
command=php /www/laravel56/artisan horizon
autostart=true
autorestart=true
user=root
redirect_stderr=true
stdout_logfile=/www/log/horizon.log
command这个执行的命令目录,写你自己的,这个是我的,其他就配置日志,写你自己的目录
如果你还没有安装supervisor可以查看我的文章
https://www.jianshu.com/p/8a6071b53c44
已经监听了
写个队列测试下吧
php artisan make:job RedisTestJobQueue
php artisan make:controller RedisTestController
如果首次运行,需要安装,请查看官方包,查看版本,我现在是是5.6就是最新的拉,所以不指定版本好
composer require predis/predis
//laravel5.2
composer require predis/predis ~1.0
RedisTestJobQueue.php
<?php
namespace App\Jobs;
use Log;
use Redis;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
class RedisTestJobQueue implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $redis_name;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct($redis_name)
{
//
$this->redis_name=$redis_name;
}
/**
* Execute the job.
*
* @return void
*/
public function handle(Redis $redis)
{
$r=$redis::rPop($this->redis_name);
$r?Log::info('del: '. $r .' is ok'):Log::info('del: '. $r .' is fail');;
}
}
RedisTestController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Redis;
use Illuminate\Http\Request;
use App\Jobs\RedisTestJobQueue;
class RedisTestController extends Controller
{
public $redis_name='testredis';
public function index(){
$r=Redis::rPush($this->redis_name,str_random());
echo $r;
}
public function runJob(){
$job = (new RedisTestJobQueue($this->redis_name));
$this->dispatch($job);
}
}
定义模拟路由
Route::get('redisJob',['uses'=>'RedisJobController@index']);
Route::get('redisJob/run',['uses'=>'RedisJobController@runJob']);
浏览器打开index写入redis
http://192.168.91.130:85/redisJob
浏览器打开runJob调用队列
http://192.168.91.130:85/redisJob/run
来监听写执行队列
php artisan queue:listen
最后horizon
image.png
日志
image.png
标签
Horizon 允许分配”标签”到任务
Horizon 会基于附加到任务的 Eloquent 模型为大部分任务以智能的方式自动打上标签
附带了一个 id 为 1 的 App\Video 实例,它将会自动打上 App\Video:1 的标签
上面的则会生成一个Hash类型的horizon:1,horizon:2,horizon:3...等
手动打标签
在Job增加一个方法
public function tags()
{
return ['render', 'video:'.$this->video->id];
}
监控
Horizon 提供了一个监控后台查看任务和队列的等待时间和吞吐量信息
再调度器里面执行,命令.如果不会可以查看这篇https://www.jianshu.com/p/b7e4cac1a7a8
protected function schedule(Schedule $schedule)
{
$schedule->command('horizon:snapshot')->everyFiveMinutes();
}
网友评论