首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
Django rest framework(7)----分页
第一种分页  PageNumberPagination 基本使用 (1)urls.py urlpatterns = [ re_path('(?P<version>[v1|v2]+)/page1
zhang_derek
2018/04/11
1.8K0
Django rest framework(7)----分页
ElementUI 分页+django rest framework
在之前的文章中,链接如下:https://www.cnblogs.com/xiao987334176/p/14313471.html
py3study
2021/03/29
1.8K0
ElementUI 分页+django rest framework
Django rest-framework视图家族
总结:GenericAPIView就是在APIView基础上额外提供了三个方法和三个类属性,如果不配合视图工具类,则体现不出来优势所在
GH
2020/01/14
8520
Django rest framework源码分析(4)----版本
版本  新建一个工程Myproject和一个app名为api (1)api/models.py from django.db import models class UserInfo(models.Model): USER_TYPE = ( (1,'普通用户'), (2,'VIP'), (3,'SVIP') ) user_type = models.IntegerField(choices=USER_TYPE) usern
zhang_derek
2018/04/11
1K0
Django rest framework源码分析(4)----版本
Django rest framework(6)----序列化
序列化 1.继承Serializer 基本使用  (1)models.py from django.db import models class UserInfo(models.Model): USER_TYPE = ( (1,'普通用户'), (2,'VIP'), (3,'SVIP') ) user_type = models.IntegerField(choices=USER_TYPE) username = mode
zhang_derek
2018/04/11
9780
Django rest framework(6)----序列化
rest_framework之解析器、路由控制、分页
解析器 我们都知道,网络传输数据只能传输字符串格式的,如果是列表、字典等数据类型,需要转换之后才能使用 但是我们之前的rest_framework例子都没有转换就直接可以使用了,这是因为rest_framework有一套解析器, 默认他会帮我们转换3种类型的数据,分别是,JSONParser,FormParser,MultiPartParser 而如果我们需要转换其他数据,需要在视图类里配置parser_classes参数,如下: from rest_framework.parsers import JSO
人生不如戏
2018/05/30
5070
Django REST framework+Vue 打造生鲜超市(四)
五、商品列表页 5.1.django的view实现商品列表页 (1)goods/view_base.py 在goods文件夹下面新建view_base.py,为了区分django和django rest framework的view 利用Django的view实现返回json数据 # goods/view_base.py from django.views.generic import View from goods.models import Goods class GoodsListView(Vie
zhang_derek
2018/04/11
5K0
Django REST framework+Vue 打造生鲜超市(四)
day93-视图封装&路由组件&版本控制
1.1 首先明确封装,因为不同的增删改查的区别就在于 表 不同,序列化器 不同,
少年包青菜
2020/03/05
4330
Python进阶41-drf框架(三)
-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。
DriverZeng
2022/09/26
6580
Python进阶41-drf框架(三)
Django REST framework 的快速入门教程
创建一个新的Django项目,叫做 tutorial,然后开始一个新的app叫做 quickstart。
菲宇
2019/06/13
1.6K0
Django-djangorestframework-渲染模块
入口 dispatch 中的 self.response = self.finalize_response(request, response, *args, **kwargs)
suwanbin
2019/12/12
7490
Django-djangorestframework-渲染模块
【微信小程序+Python后台从0到1实战开发】06微信小程序新闻发布及(restful)API调用
day07 功能 1.发布 1.1 小程序 1.2 API from rest_framework.views import APIView from rest_framework.generics import CreateAPIView from rest_framework import serializers from apps.api import models class NewsDetailModelSerializer(serializers.Serializer): key = s
天道Vax的时间宝藏
2021/08/11
7650
Django Rest Framework(认证、权限、限制访问频率)
上述操作中均是对单独视图进行特殊配置,如果想要对全局进行配置,则需要再配置文件中写入即可。
用户1214487
2022/03/26
3.1K0
Django Rest Framework(认证、权限、限制访问频率)
Django rest Framework入门 四 :视图
在Django rest Framework入门 二 :DRF框架初体验中其实已经使用了视图了(book.views里面的代码),而且就是实际开发中最常用的模式,但是那是经过DRF框架高度封装的,代码的可读性不好,而且如果不了解里面的细节,当以后遇到需要定制化的工作时可能就无从下手,这一篇笔记会记录一些我自己认为比较重要切常用的实现细节。
panzhixiang
2024/10/30
2800
Django Rest Framework(版本、解析器、序列化、数据验证)
为了这种情况下每次都要decode,loads,显得麻烦,所以才有的解析器。弥补了django的缺点
用户1214487
2022/03/26
2.4K0
Django Rest Framework(版本、解析器、序列化、数据验证)
从入门到"精通"Django REST Framework-(五)
GenericAPIView 是 Django REST Framework (DRF) 中的一个基础视图类,它继承自 APIView,并添加了一些常用的功能,特别是与数据库模型交互的功能。它是 DRF 中通用视图和视图集的基础,提供了查询、序列化、分页等常用操作的标准实现。本质上它是 DRF 中所有通用视图(如 ListAPIView、RetrieveAPIView 等)的基础。
rxg456
2025/03/01
4630
从入门到"精通"Django REST Framework-(五)
3. DRF进阶之DRF视图和常用功能
APIView:DRF提供的所有视图的基类,继承View并扩展,具备了身份认证、权限检查、流量控制等功能
alexhuiwang
2023/01/16
5.4K0
drf分页器
也可通过自定义Pagination类,来为视图添加不同分页行为。在视图中通过pagination_clas属性来指明。例如:
仙人技术
2020/07/14
8991
Django rest framework源码分析(1)----认证
一、基础 1.1.安装 两种方式: github pip直接安装 pip install django-rest-framework 1.2.需要先了解的一些知识 理解下面两个知识点非常重要,django-rest-framework源码中到处都是基于CBV和面向对象的封装 (1)面向对象封装的两大特性 把同一类方法封装到类中 将数据封装到对象中 (2)CBV 基于反射实现根据请求方式不同,执行不同的方法 原理:url-->view方法-->dispatch方法(反射执行其它方法:GET/POST/P
zhang_derek
2018/04/11
2.2K0
Django rest framework源码分析(1)----认证
rest_framework框架的基本组件
快速实例 Quickstart 序列化 创建一个序列化类 简单使用 开发我们的Web API的第一件事是为我们的Web API提供一种将代码片段实例序列化和反序列化为诸如json之类的表示形式的方式。我们可以通过声明与Django forms非常相似的序列化器(serializers)来实现。 models部分: from django.db import models # Create your models here. class Book(models.Model): title=mod
阿强Wwlt
2018/07/09
9480
推荐阅读
相关推荐
Django rest framework(7)----分页
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验