# 高阶篇五 命令行异步多进程队列类的应用 >[info] 运行环境 推荐 Linux (win环境下我没有测试过) >需要安装Redis > ### 第一步 创建命令行运行文件 创建一个文件 继承WorkerCommand即可! ~~~ <?php namespace app\base\command; use mikkle\tp_worker\WorkerCommand; /** * Created by PhpStorm. * Power by Mikkle * QQ:776329498 * Date: 2017/6/12 * Time: 15:07 */ class Mikkle extends WorkerCommand { } ~~~ >[danger] Ok!不要奇怪,其实就是代码这么少! ### 第二步 注册command文件 在app下面的command.php文件中写入 ~~~ <?php return [ 'app\base\command\Mikkle', ]; ~~~ ### 第三步 启动命令行 在命令行界面 进入网站的根目录 ~~~ php think mikkle ~~~ 这样命令行就跑起来了 ![](https://box.kancloud.cn/a092efc328be9d1a0baab9c018273186_477x143.png) 分一个窗口 运行命令查看运行状态 `ps -ef |grep mikkle | grep -v grep` ![](https://box.kancloud.cn/38c153ff8f0c665d96054676ef32b10e_413x31.png) 这样异步的命令行部分已经完成 ### 第四步 编写异步队列执行类 >[danger]只要继承mikkle\tp_worker\WorkerBase即可 ~~~ <?php /** * Created by PhpStorm. * User: Mikkle * QQ:776329498 * Date: 2017/8/2 * Time: 15:59 */ namespace app\worker; use mikkle\tp_worker\WorkerBase; use think\Log; class Test extends WorkerBase { protected function runHandle($data) { for ($i=1 ; $i<10;$i++){ $this->sleep(1); echo '睡眠一秒'; } Log::notice( "测试" ); } } ~~~ >[info] 在这里我们只需要写命令行回调方法runHandle即可 >data的值是通过静态方法add添加 > ### 第五步 启动异步队列执行类 ~~~ $data =[ "name"=>"mikkle" ]; $Result = \app\worker\Test::add( $data); return $Result; ~~~ >[danger] Ok 搞定! 运行一下看效果 ![](https://box.kancloud.cn/b25ae16f56f7a4b1f68431a4dc6e88bb_670x400.png) >[info] 每次运行异步任务时候,命令行这边会创建全新的子进程执行该任务!执行结束后子进程自动关闭! ###测试效果 同时开启10个异步队列效果 ![](https://box.kancloud.cn/735fd3c30ae01562d403e60130f21ef3_371x131.png) 程序会发起10个子进程进行处理不同的队列任务 ### 循环任务示例 ~~~ <?php /** * Created by PhpStorm. * User: Mikkle * QQ:776329498 * Date: 2018/2/23 * Time: 16:20 */ namespace app\worker\auto; use mikkle\tp_worker\CycleWorkBase; use mikkle\tp_tools\Curl; use think\Exception; use think\Log; class Cycle extends CycleWorkBase { protected function runHandle($data) { try{ while ( true ){ self::signWorking(); Curl::get( "http://www.mikkle.cn/"); $time = $this->getNextRunTime(); $this->sleep($time); Log::notice("循环执行程序执行程序".time() ); } }catch (Exception $e){ Log::notice( $e ->getMessage()); } } protected function getNextRunTime(){ if (time()<strtotime( "02:00") ){ return 15; }elseif(time()<strtotime( "09:57") ){ return 180; }elseif(time()<strtotime( "22:00") ){ return 30; }elseif(time()<strtotime( "23:59") ){ return 15; } return 60; } } ~~~ ### 异步钩子示例 >[info] 注册Hook文件 tags.php ~~~ 'hook_test'=>[ "app\\base\\behavior\\worker\\Test", ], ~~~ >[info] 新建钩子文件 继承 mikkle\tp_worker\WorkerHookBase即可 ~~~ <?php /** * Created by PhpStorm. * User: Mikkle * QQ:776329498 * Date: 2018/2/1 * Time: 9:10 */ namespace app\base\behavior\worker; use mikkle\tp_worker\WorkerHookBase; use think\Log; class Test extends WorkerHookBase { protected function runHandle($data) { for ($i=0 ; $i<10;$i++){ $this->sleep(1); echo '睡眠一秒'; } Log::notice( "测试" ); } } ~~~ 感谢大家关注 交流请加QQ群 321449759 ![](https://box.kancloud.cn/3499008a08e64306c68873288092a057_286x340.png)