首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【黄啊码】windows如何使用tp5.1配置workerman和gateway(不要看官方文档,不要抄网友文档,OK?)

【黄啊码】windows如何使用tp5.1配置workerman和gateway(不要看官方文档,不要抄网友文档,OK?)

作者头像
黄啊码
发布于 2023-03-06 09:29:26
发布于 2023-03-06 09:29:26
1.3K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,我是黄啊码,由于项目需要被迫无奈在老项目上整合workerman,整整浪费了我一天,按着tp官方文档去做,一个又一个的坑,然后百度网友的答案,又是一个又一个的天坑,真的无力吐槽,今天我就把自己的经历写在这里,网友们,别再踩坑了。

目录

第一坑:composer

第二坑:官方代码问题

第三坑: 网友代码问题

第一坑:composer

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
composer require topthink/think-worker=2.0.*

这是官方文档给的,我照搬,一顿操作下来,没啥毛病,但是:由于官方对应的版本是比较老的,配置文件又是新的,导致以下位置找不到文件:

原因:官方为了避免Event和关键字Events冲突,直接将Event改成了Events,结果就是会导致Events::onMessage is not callable。

 好了,这是天坑,先给大家指出来,咱们先做直接走起:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
composer require topthink/think-worker=2.0.8

记住:是2.0.8,高也不要,低也不要,不然就会出现上边的问题,那你们就自己排查吧,欲哭无泪的那种。

一下是我compoers出来的workerman版本,仅供参考:

接下来开始启动吧:

think-worker默认有命令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
php think worker:gateway

急急如律令,肯定是这个:

结果:丢,这是啥玩意儿:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GatewayWorker Not Support On Windows

这并不是说gateway不能再windows上运行,而是gateway需要启动好几个命令行,windows下无法直接处理,先做咱们就开始走起来吧

先自定义命令行文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php


namespace app\command;

use think\console\Input;
use think\console\input\Argument;
use think\console\input\Option;
use think\console\Output;
use think\facade\Config;
use think\worker\command\GatewayWorker;
use Workerman\Worker;

/**
 * GatewayWorker win环境下的启动
 *
 * Class GatewayWorkerWin
 * @package app\command
 */
class GatewayWorkerForWin extends GatewayWorker
{
    public function configure()
    {
        $this->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("<error>Invalid argument action:{$service}, Expected gateway|register|business_worker.</error>");
                exit(1);
                break;
        }

        Worker::runAll();
    }
}

 位置在这里,别走错路了:

 然后配置对应的命令行:改config/console.php文件,添加workerman命令

好了,到此配置结果,开动:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
php think workerman register
php think workerman businessworker
php think workerman gateway

第一步:没问题:

 第二步:没问题:

第三步:。。。。丢,这是啥玩意儿:

一步一步排查,排查到这里:

原来是GatewayWorker.php的option获取的东西是空的:

第二坑:官方代码问题

原来官方的代码是Config:get('gatewayworker'),而这里是:

第三坑: 网友代码问题

到这里你应该觉得结束了,但是。。。运行还是报错,还是同样的错误,看来看去这代码没问题啊,难道是Config这个函数出错,输出了一下,果然是空的,不对,tp5的语法不是Config::get('文件名.变量名')吗?怎么这里是这样,我一度怀疑是官方文档更新了,查了文档

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Config::set()   设置配置项

Config::get() 获取配置项

Config::pull() 仅仅只获取一级配置项

Config::has() 判断配置项是否存在

so》》》获取文件里边所有的配置项不是pull吗? 好了,直接改:

再次运行:php think workerman gateway

欲哭无泪啊,怎么会有如此低级的错误?来源:代码是抄网友的。。。

所以,如果你的tp框架是5.1+的,不建议你抄网文,因为天下文章一般抄,球球你们,别抄了,看我吧!!

好了,今天的分享就这里,有问题的留个言,别忘了一键三连,下次我们还会再见!

我是黄啊码,码字的码,退。。。退。。。退。。。朝! 

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-02-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Elasticsearch探索: Reindex API
5.X版本后新增Reindex。Reindex可以直接在Elasticsearch集群里面对数据进行重建,如果你的mapping因为修改而需要重建,又或者索引设置修改需要重建的时候,借助Reindex可以很方便的异步进行重建,并且支持跨集群间的数据迁移。
HLee
2021/01/14
2.5K0
Elasticsearch探索: Reindex API
【Elasticsearch系列之八】通过reindex迁移ES数据
reindex 是 ES 提供的一个 api 接口,可以把数据从源 ES 集群导入到当前 ES 集群,实现集群内部或跨集群同步数据。
Vicwan
2020/04/27
10.2K0
干货 | Elasticsearch 8.X 版本升级指南
所以,市面上的各家公司在使用 Elasticsearch 过程中,都有自己的版本选型。根据我个人的调研和不完全观察,当前 1.X、2.X、5.X、6.X、7.X、8.X 版本都有大量的公司在使用。
铭毅天下
2022/09/26
3.5K0
干货 | Elasticsearch 8.X 版本升级指南
关于重建索引 API 使用和故障排查的 3 个最佳实践
您的客户端将在 N 秒后关闭非活动套接字;以 Kibana 为例,如果重建索引操作无法在 120 秒内(v7.13 中默认的 server.socketTimeout 值)完成,您将看到“backend closed connection”(后端已关闭连接)消息。
周银辉
2024/05/09
3550
ElasticSearch的Reindex
ES在BI应用中常常仅仅只作为全文检索库,数据的加工在数据库中进行,数据如何同步到ES中?一般的思路有增量和全量,对于超大数量的场景,如千万、亿+,全量的同步会非常慢,如何进行增量呢?ES支持在内部reindex,其包含哪些场景?给索引增、删、改一列或某些列是否可以单独只同步修改的列?
零分影魔
2020/08/20
2.8K0
Elasticsearch 线上实战问题及解决方案探讨
我有 1tb 的一个大索引若干,要迁移到另外一个新集群去,有没有好办法?reindex好像会中断......
铭毅天下
2023/11/27
4120
Elasticsearch 线上实战问题及解决方案探讨
elasticsearch文档Delete By Query API(二)
开发者可以利用Task API获取任何正在运行的 deletebyquery操作的状态,如下:
江南一点雨
2018/12/27
1.5K0
elasticsearch文档Delete By Query API(二)
干货 | Elasticsearch Reindex性能提升10倍+实战
reindex和snapshot的速率比用filebeat或者kafka到es的写入速率慢好几个数量级(集群写入性能不存在瓶颈),reindex/snapshot的时候CPU还是IO使用率都很低,是不是集群受什么参数限制了reindex和snapshot的速率?
铭毅天下
2018/08/14
3.8K0
Elasticsearch 7.16 强势升级至 8.13.4,引爆数据革命新纪元!
Elasticsearch是一个强大的搜索和分析引擎,随着新版本的发布,升级是保持系统性能和安全性的关键。将Elasticsearch从7.16升级到8.13.4是一个复杂且关键的过程,涉及多方面的准备和实施步骤。
DBA实战
2024/09/06
3720
Elasticsearch 7.16 强势升级至 8.13.4,引爆数据革命新纪元!
干货 | Elasticsearch开发人员最佳实战指南
几个月以来,我一直在记录自己开发Elasticsearch应用程序的最佳实践。本文梳理的内容试图传达Java的某些思想,我相信其同样适用于其他编程语言。我尝试尽量避免重复教程和Elasticsearch官方文档中已经介绍的内容。本文梳理的内容都是从线上实践问题和个人总结的经验汇总得来的。
铭毅天下
2020/04/08
1.8K0
干货 | Elasticsearch开发人员最佳实战指南
Elasticsearch 8.X 最新学习路线图——一图在手,进阶跟我走!
在大数据时代,Elasticsearch 作为一款强大的搜索和分析引擎,被广泛应用于各种场景。无论是实时日志分析、全文搜索还是复杂数据的实时处理,Elasticsearch 都能胜任。
铭毅天下
2024/05/28
1.8K0
Elasticsearch 8.X 最新学习路线图——一图在手,进阶跟我走!
Elasticsearch 跨网络、跨集群同步选型指南
这是个经常被问到的问题。涉及到跨版本、跨网络、跨集群的索引数据的迁移或同步。我们拆解一下:
铭毅天下
2021/06/25
4.1K1
Elasticsearch 跨网络、跨集群同步选型指南
所有您需要了解的关于Elasticsearch 5.0:索引管理
我们看到两种主要的Elasticsearch索引使用模式 - 全局索引和滚动索引。多年来,Elasticsearch增加了一些功能,可以极大地改善这些模式的工作体验。Elasticsearch 5引入了几项新功能,进一步构建了这些功能,并产生了一个非常好的索引管理故事。
Noah____________________
2018/06/01
1.8K1
Elasticsearch 7.16 强势升级至 8.13.4,引爆数据革命新纪元之详细版
Elasticsearch是一个强大的搜索和分析引擎,随着新版本的发布,升级是保持系统性能和安全性的关键。将Elasticsearch从7.16升级到8.13.4是一个复杂且关键的过程,涉及多方面的准备和实施步骤。
DBA实战
2024/09/06
5280
Elasticsearch 7.16 强势升级至 8.13.4,引爆数据革命新纪元之详细版
全文检索的极致之选:Elasticsearch完全指南
倒序索引也被称为“反向索引”或“反向文件”,是一种索引数据结构。倒序索引在“内容”和存放内容的“位置”之间的映射,其目的在于快速全文索引和使用最小处理代价将新文件添加进数据库。通过倒序索引,可以快速根据“内容”查到包含它的文件。这种数据结构被广泛使用在搜索引擎中,倒排索引有两种不同的索引形式:
用户1413827
2023/11/28
1.3K0
Elasticsearch文档和映射
在Elasticsearch的说法中,文档是序列化的JSON数据。在典型的ELK设置中,当您发送日志或度量标准时,它通常会发送到Logstash,Logstash按照Logstash配置的定义进行格式化,变异处理和以其他方式处理数据。生成的JSON在Elasticsearch中编制索引。
February
2018/11/08
1.9K0
Elasticsearch: Reindex接口
在我们开发的过程中,我们有很多时候需要用到 Reindex 接口。它可以帮我们把数据从一个 index 到另外一个 index 进行重新reindex。这个对于特别适用于我们在修改我们数据的 mapping 后,需要重新把数据从现有的 index 转到新的 index 建立新的索引,这是因为我们不能修改现有的 index 的 mapping 一旦已经定下来了。在接下来的介绍中,我们将学习如何使用 reindex 接口。
腾讯云大数据
2020/09/25
1.2K0
Elasticsearch: Reindex接口
Elasticsearch 8.X 检索实战调优锦囊 001
可以考虑用 filter “包裹一层”,如处理时间范围检索,Elasticsearch 能缓存部分结果。但,要说明的是更换时间窗口,换不同时间段检索,原有缓存不起作用。
铭毅天下
2022/09/26
1.3K0
Elasticsearch 8.X 检索实战调优锦囊 001
Elasticsearch:Index 生命周期管理入门
如果你要处理时间序列数据,则不想将所有内容连续转储到单个索引中。 取而代之的是,您可以定期将数据滚动到新索引,以防止数据过大而又缓慢又昂贵。 随着索引的老化和查询频率的降低,您可能会将其转移到价格较低的硬件上,并减少分片和副本的数量。
腾讯云大数据
2020/10/09
4K1
Elasticsearch:Index 生命周期管理入门
[转]Elasticsearch:在不停机的情况下优化 Elasticsearch Reindex
在使用 Elasticsearch 的时候,总会有需要修改索引映射的时候,遇到这种情况,我们只能做 _reindex。 事实上,这是一项相当昂贵的操作,因为根据数据量和分片数量,完成索引的完整复制可能需要长达几个小时的时间。
保持热爱奔赴山海
2024/05/08
3400
推荐阅读
相关推荐
Elasticsearch探索: Reindex API
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档