美文网首页laravellaravel
laravel之horizon队列管理系统

laravel之horizon队列管理系统

作者: 空气KQ | 来源:发表于2018-06-13 13:51 被阅读4次

版本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

image.png
已经监听了

写个队列测试下吧

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();
}

相关文章

网友评论

    本文标题:laravel之horizon队列管理系统

    本文链接:https://www.haomeiwen.com/subject/jtpreftx.html