# 高阶篇五 命令行异步多进程队列类的应用
>[info] 运行环境 推荐 Linux (win环境下我没有测试过)
>需要安装Redis
>
### 第一步 创建命令行运行文件
创建一个文件 继承WorkerCommand即可!
~~~
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文件中写入
~~~
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即可
~~~
/**
* 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个子进程进行处理不同的队列任务
### 循环任务示例
~~~
/**
* 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()
return 15;
}elseif(time()
return 180;
}elseif(time()
return 30;
}elseif(time()
return 15;
}
return 60;
}
}
~~~
### 异步钩子示例
>[info] 注册Hook文件 tags.php
~~~
'hook_test'=>[
"app\\base\\behavior\\worker\\Test",
],
~~~
>[info] 新建钩子文件 继承 mikkle\tp_worker\WorkerHookBase即可
~~~
/**
* 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)