敬爱的读者们,我是黄阿码,倍感荣幸在这里分享我遭遇的一段颇具挑战性的经验。应项目需求,我需将TP框架融入现有的项目中,然而这个过程花费了整整一天的时间。在此过程中,尽管我阅读了众多的官方文档以及网络资料,仍然充满了迷茫。如今,我决定详尽地记录这次经历,以期为诸位提供参考,避免重蹈覆辙。
composer require topthink/think-worker=2.0.*
官方文档的坑:版本不匹配
composer require topthink/think-worker=2.0.8
composer require workerman/gateway-worker=3.0
文档因旧配置与现行版本不符而产生文件定位困扰。为避免语法冲突,官方实施事件名替换策略,但由此引发"::isnot"问题。此为当前主要问题,请您留心。建议选用2.0.8或者3.0版本,并避免私自调整版本或使用星号,以防问题发生。若出现此类情况,可能需由您自行解决,对此我们深感歉意。
命令行配置的坑:多命令行启动
php think worker:gateway
依据指示手册完成配置步骤后,需执行多种命令以实现预定功能。调整对应PHP文档,添加特定指令,经过仔细核实确保无误之后方可进行下一步操作。然而,在第二阶段过程中却在获取信息时遭遇困境。据研究分析,此情况主要由官方所供应代码中所存在的漏洞以及其他用户已经揭露过的编码难题导致。
网友代码的坑:抄来的代码不靠谱
GatewayWorker Not Support On Windows
虽已找出问题症结,然而问题依旧未解,程序仍旧报错。深入分析,无明显缺陷之后,我们开始怀疑函数输出是否存在问题。最终证实,输出确实为空。经过钻研,得知:>格式仅能获取部分配置,遂将方式更改为:pull。再行测试,效果未见改善。核查php文件,所有变量标识符皆为小写字符。因变量大小写模糊导致错误。此次事故源于盲目复制、粘贴他人代码,教训深刻。
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');
}
/**
* linux直接使用
* php think worker:gateway
* 由于windows下不支持下无法使用status、stop、reload、restart等命令。
* 所以去掉status、stop、reload、restart、守护进程等命令。
* 文档说明: https://www.workerman.net/doc/workerman/must-read.html
* windows系统下workerman单个进程仅支持200+个连接。
* windows系统下无法使用count参数设置多进程。
* windows系统下无法使用status、stop、reload、restart等命令。
* windows系统下无法守护进程,cmd窗口关掉后服务即停止。
* windows系统下无法在一个文件中初始化多个监听。
* linux系统无上面的限制,建议正式环境用linux系统,开发环境可以选择用windows系统。
*
* 命令使用:
* php think worker:gateway_win register
* php think worker:gateway_win business_worker
* php think worker:gateway_win gateway
*
* @param Input $input
* @param Output $output
* @return int|void|null
*/
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();
}
}
自定义类的坑:继承类的问题
在引入类至源代码之后,目录结构将变得十分复杂。欲进行自定义设置,需先创建子类来扩展目标类,并将其置于"http"文件夹内,同时调整配置文件。然而,重启电脑后仍有可能出现问题。因此,在继承过程中务必明确指定数据存储路径。经过上述操作后,最终效果如图所示。特别提示,由于TP框架已更新至5.1以上版本,建议尽量避免直接引用网络资源。尽管可借助文字作品作为参考,但我们依然鼓励大家尊重原创,认真欣赏我们的原创内容。5.1速成指南·1初级教程·探索浩瀚星空。
总结与建议:别再踩这些坑了
php think workerman register
php think workerman businessworker
php think workerman gateway
本篇报告告一段落。若对其中内容存疑,尽可随时提问;同时也请赏赞、收藏及投币,对此表示尊敬与支持。本人亲身经历此番风波,深知无论是红色标示说明书,抑或是开源网络代码,处处皆潜藏危机。尤其是新式架构接入旧项目过程中,挑战层出不穷。愿各位以此为鉴,恪守原则,避免重蹈覆辙。
提问与互动:你遇到过类似的坑吗?
请问您是否遇到过在运用应用框架或者引入第三方代码时的困难?如有相关经验和解决策略,恳请您在此处留言共享。我们期待与您深入讨论,共同提升技术水平。另外,期望您能对本文收藏并转发给更多开发人员,以协助他们解决类似问题。