大家好,我是黄啊码,由于项目需要被迫无奈在老项目上整合workerman,整整浪费了我一天,按着tp官方文档去做,一个又一个的坑,然后百度网友的答案,又是一个又一个的天坑,真的无力吐槽,今天我就把自己的经历写在这里,网友们,别再踩坑了。
目录
第一坑:composer
composer require topthink/think-worker=2.0.*
这是官方文档给的,我照搬,一顿操作下来,没啥毛病,但是:由于官方对应的版本是比较老的,配置文件又是新的,导致以下位置找不到文件:
原因:官方为了避免Event和关键字Events冲突,直接将Event改成了Events,结果就是会导致Events::onMessage is not callable。
好了,这是天坑,先给大家指出来,咱们先做直接走起:
composer require topthink/think-worker=2.0.8composer require workerman/gateway-worker=3.0
记住:是2.0.8和3.0,高也不要,低也不要,也不要用*号,不然就会出现上边的问题,那你们就自己排查吧,欲哭无泪的那种。
以下是我compoers出来的workerman版本,仅供参考:
接下来开始启动吧:
think-worker默认有命令
php think worker:gateway
急急如律令,肯定是这个:
结果:丢,这是啥玩意儿:
GatewayWorker Not Support On Windows
这并不是说gateway不能再windows上运行,而是gateway需要启动好几个命令行,windows下无法直接处理,先做咱们就开始走起来吧
先自定义命令行文件:
setName('worker:gateway_win') ->addArgument('service', Argument::OPTIONAL, 'workerman service: gateway|register|business_worker', null) ->addOption('host', 'H', Option::VALUE_OPTIONAL, 'the host of workerman server.', null) ->addOption('port', 'p', Option::VALUE_OPTIONAL, 'the port of workerman server.', null) ->setDescription('GatewayWorker Server for ThinkPHP runs on Windows system'); } public function execute(Input $input, Output $output) { $service = $input->getArgument('service'); $option = Config::pull('gateway_worker'); if ($input->hasOption('host')) { $host = $input->getOption('host'); } else { $host = !empty($option['host']) ? $option['host'] : '0.0.0.0'; } if ($input->hasOption('port')) { $port = $input->getOption('port'); } else { $port = !empty($option['port']) ? $option['port'] : '2347'; } $registerAddress = !empty($option['registerAddress']) ? $option['registerAddress'] : '127.0.0.1:1236'; switch ($service) { case 'register': $this->register($registerAddress); break; case 'business_worker': $this->businessWorker($registerAddress, isset($option['businessWorker']) ? $option['businessWorker'] : []); break; case 'gateway': $this->gateway($registerAddress, $host, $port, $option); break; default: $output->writeln("Invalid argument action:{$service}, Expected gateway|register|business_worker. "); exit(1); break; } Worker::runAll(); }}
位置在这里,别走错路了:
然后配置对应的命令行:改config/console.php文件,添加workerman命令
好了,到此配置结果,开动:
php think workerman registerphp think workerman businessworkerphp think workerman gateway
第一步:没问题:
第二步:没问题:
第三步:。。。。丢,这是啥玩意儿:
一步一步排查,排查到这里:
原来是GatewayWorker.php的option获取的东西是空的:
第二坑:官方代码问题
原来官方的代码是Config:get('gatewayworker'),而这里是:
第三坑: 网友代码问题
到这里你应该觉得结束了,但是。。。运行还是报错,还是同样的错误,看来看去这代码没问题啊,难道是Config这个函数出错,输出了一下,果然是空的,不对,tp5的语法不是Config::get('文件名.变量名')吗?怎么这里是这样,我一度怀疑是官方文档更新了,查了文档
Config::set() 设置配置项Config::get() 获取配置项Config::pull() 仅仅只获取一级配置项Config::has() 判断配置项是否存在
so》》》获取文件里边所有的配置项不是pull吗? 好了,直接改:
再次运行,额,虽然可以,但运行的依旧是 think\worker里边的Events,也就是根本没有正确获取到变量BusinessWorker里边的值
看了下gateway_worker.php里边的变量名称,全都是小写,难道是BusinessWorker是大写的原因
好,我改还不行吗?:php think workerman gateway
欲哭无泪啊,怎么会有如此低级的错误?来源:代码是抄网友的。。。
第四坑:自定义events类
由于events类放在源文件里边,整个目录结果看上去很奇怪,位置如下:
如果我们想自定义那就必须写一个类继承events类,只需要将其放在http文件夹中,然后修改配置文件:
然而重启你就会发现又报错了:
这又是啥?原来Events类里边有个类名称叫application
所以我们在继承events时也要告诉自己的代码,这个application是位于哪里的:
这么一顿操作,改成如下:
重启,完美收官:
所以,如果你的tp框架是5.1+的,不建议你抄网文,因为天下文章一般抄,球球你们,别抄了,看我吧!!如果还是要抄,文档给你们
ThinkPHP 5.1 Workerman 快速上手指南 · ThinkPHP5.1 Workerman上手指南 · 看云
出门右拐,别再来了哈。
好了,今天的分享就这里,有问题的留个言,别忘了一键三连,下次我们还会再见!
我是黄啊码,码字的码,退。。。退。。。退。。。朝
来源地址:https://blog.csdn.net/TiaoZhanJi_Xian/article/details/128837525