之前写过一篇博客,介绍把wokerman的回调函数定义到thinkphp的控制其中,并通过命令启动.
tp5.1最新版集成workerman如何自定义命令并把业务逻辑写到控制器里
但是有局限性,那篇文章是在windows下实现的,linux不能直接使用,并且一次命令只能启动一个控制器,就是说你有两个控制器需要后台启动,无法用一条命令启动.本片文章为解决这个需求的解决方案.但是只适合linux版本.不兼容windwos.
需求目标
- 把业务逻辑写到控制器里
- 不同的业务写到不同的控制器
- 可以通过命令启动指定或全部的业务代码
即以下命令可以启动getPageHref和getPageSrc两个控制器代码
php think spider start GetPageHref/GetPageSrc
上面命令运行的效果(每个控制器也可以启动不同的进程数,但这都是在业务代码实现的),命令行可以选择启动不同的代码或全部代码.
workerman系统兼容介绍
workerman的windwos版本和linux核心逻辑不同,在解析命令,使用扩展,子进程方式都不同,在实现如题需求时遇到以下兼容问题:
- 解析命令不同,具体可查看两个版本的worker文件
- 启动扩展不同,linux使用了posix扩展
- 子进程方式不同,其导致了windwos不能在同一文件启动多个woker,也让在linux下如题需求得以解决,具体参见手册.入口
thinkphp自定义指令
为了定义该命令,我们修改了application/command.php文件如下
return [
'app\common\command\Spider',
];
建立相关目录文件:
Spider.php的基本指令代码,等下会有全部的代码,可以复制使用.
/**
* configure
* tp框架自定义指令特性
* 注册命令参数
* @return mixed
*/
protected function configure()
{
$this->setName('spider')
->addArgument('status', Argument::OPTIONAL, "status")
->addArgument('controller_name', Argument::OPTIONAL, "controller_name/controller_name")
->addArgument('mode', Argument::OPTIONAL, "d")
->setDescription('spider control');
/**
* 以上设置命令格式为:php think spider [status] [controller_name/controller_name] [d]
* think 为thinkphp框架入口文件
* spider 为在框架中注册的命令,上面setName设置的
* staus 为workerman框架接受的命令
* controller_name/controller_name 为控制器名称,以正斜线分割,执行制定控制器,为空或缺省则启动所有控制器,控制器列表在controller_name属性中注册
* d 最后一个参数为wokerman支持的-d-g参数,但是不用加-,直接使用d或者g
*/
}
上面的代码是thinkphp的特性所支持的内容,基本的内容是,设置指令名称为"spider"并接受其他参数,
以上设置可以接受以下形式的命令.
php think spider start
php think spider start all d
php think spider start GetPageHref d
介绍逻辑
运行中,我们发现workerman原生地解析命令行方法不适用,所以需要重写,因此:
- 新建一个Start.php控制器当作业务基类.
- 该控制器继承worker.
- 该控制器重写parseCommand()方法.
- 为了实现重写,添加静态属性argvs.
start.php代码,该部分代码可以直接复制使用.其中所有逻辑都是worker原生的没有改动,只是改动了参数数组.原有的是直接在命令行获取,现在改称从静态属性获取.
<?php
namespace app\