artisan命令生成和redis消息订阅和任务调度

  • 扩展笔记肖峰--102-任务调度-Ubuntu16.04服务器

提示,本文章是针对5.3版本

执行命令生成一个artisan命令,文件会在1app/Console/Commands目录下

    php artisan make:command Tcm  --command=Tcm:hello
artisan命令生成和redis消息订阅和任务调度_第1张图片
Paste_Image.png

如果想在执行命令php artisan Tcm:hello的时候运行什么程序,就写在Tcm.php里面

artisan命令生成和redis消息订阅和任务调度_第2张图片
image.png

但是这个时候执行是不会成功的

artisan命令生成和redis消息订阅和任务调度_第3张图片
Paste_Image.png

因为我们只是创建了执行这个命令的类,但是并没有注册
我们来看laravel手册,创建之后需要注册

artisan命令生成和redis消息订阅和任务调度_第4张图片
Paste_Image.png
artisan命令生成和redis消息订阅和任务调度_第5张图片
Paste_Image.png

下面继续展示我的项目

artisan命令生成和redis消息订阅和任务调度_第6张图片
Paste_Image.png

Tcm.php中$signature这个属性将是执行命令的最终属性

Paste_Image.png

Kernel.php中 $commands数组是注册的路由

artisan命令生成和redis消息订阅和任务调度_第7张图片
Paste_Image.png

artisan命令生成和redis消息订阅和任务调度_第8张图片
Paste_Image.png

这个时候 php artisan 或者 php artisan list查看列表

artisan命令生成和redis消息订阅和任务调度_第9张图片
image.png

  • 我们每次执行php artisan tcm:hello 会发现我们的数据库里会插入一条数据
    5.2或者以前的话,注册完成后可能需要执行php artisan dump_autoload,加载下,但是5.3我发现这条命令已经没有了,而且我们也不需要执行

artisan命令生成和redis消息订阅和任务调度_第10张图片
Paste_Image.png

运行 artisan命令的时候,执行的代码是 App\Console\Commands\Tcm.php里面的 handle方法

artisan命令生成和redis消息订阅和任务调度_第11张图片
image.png

2.创建消息订阅

首先我们随便发布一个消息 第一个参数是频道,第二个参数是内容

Paste_Image.png
    php artisan make:command RedisSubscribe
Paste_Image.png

我们还像刚才一样把命令名称写下 比如我用了redis:subscribe

Paste_Image.png

然后我们在 RedisSubscribe控制器订阅消息 第一个参数是频道名,第二个参数是消息内容

artisan命令生成和redis消息订阅和任务调度_第12张图片
Paste_Image.png

这个时候我们查看我们的可执行命令

Paste_Image.png

然后我们开启订阅频道

Paste_Image.png

这个时候,我们不断的刷新 http://45.119.97.156/(因为我刚才把发布消息放在了这个文件下),在终端就可以收到消息

Paste_Image.png

3.任务调度

首先进入crontab文件 vi /etc/crontab

Paste_Image.png

然后

artisan命令生成和redis消息订阅和任务调度_第13张图片
Paste_Image.png

下面的两个是我写的,一个是每分钟写一个hello到tmp/aaa目录,另一个是执行 php artisan schedule:run命令
五个星号从左到右分别是 分 时 后面的忘了

vi app/Console/Kernel.php进入这个文件,在schedule方法里面写任务
我自己随便写了一个任务,每分钟吧users表里面的amount,每分钟加1

    相当于是执行了  php  artisan schedule:run  代码之后,运行 schedule()方法里面的内容
    我们在这个方法里面写了运行 tcm:test 指令
    当我们手动执行一次  php artisan schedule:run
artisan命令生成和redis消息订阅和任务调度_第14张图片
image.png

如果在项目终端直接执行 php artisan schedule:run,那么Kernel.php里面的schedule方法就会执行一次

  • 把正确的结果输出到一个文件里面,错误的结果输出到另一个文件里面
  • 加不加&符号,输出都会到/tmp/redis或者rediserr文件里面。但是加上&符号会直接在后台运行,不加&符号会一直在终端开启。
nohup php artisan redis:subscribe 1>>/tmp/resid   2 >> /tmp/rediserr   &
artisan命令生成和redis消息订阅和任务调度_第15张图片
加&符号和不加&符号的区别.png

手册任务调度

执行artisan命令的时候,显示进度条

  • 参考--Laravel 应用实践:如何优雅的完成全量数据同步
    artisan命令生成和redis消息订阅和任务调度_第16张图片
    image.png
 $pre = $this->option('pre'); 是执行命令的时候添加的参数
 $this->info('sync pre points!');   是执行命令后,在终端显示的信息。

 下面这句话的意思是,敲命令的时候,带上 --pre  才会在终端显示'sync pre points!'这句话
 $pre = $this->option('pre');
        if ($pre) {
            $this->info('sync pre points!');  
            }
注意
createProgressBar(count) 里面的参数是总进度条数,
我们每执行一次, $bar->advance();就会前进一点。如果我们执行的条数达不到createProgressBar(count)里面的总数,
比如我们总数执行了一般,那么就会在50%处停止。但是我们如果在循环外面写 
$bar->finish();执行完毕后,总会是百分之百。所以我们最好将createProgressBar(count)的count参数写成我们执行条数的总数,这样才精确

你可能感兴趣的:(artisan命令生成和redis消息订阅和任务调度)