首先看CRMEB驻留内存的bat

start cmd /c php think workerman start chat
start cmd /c php think workerman start admin
start cmd /c php think timer start
php think workerman start channel

程序启动于think文件

#!/usr/bin/env php
<?php
namespace think;// 加载基础文件
require __DIR__ . '/vendor/autoload.php';// 应用初始化
(new App())->console->run();

CRMEB基于ThinkPHP,ThinkPHP按composer的模式整理了程序的启动过程,有空的小白应该可能去认真研读一下autoload.php内部的相关代码,这样对学习进程会很有帮助

通过命名空间think找到vendor/topthink/framework/src/think/Console.php文件,Console类中,__construct函数通过loadCommands函数加载了配置

    /*** 加载指令* @access protected*/protected function loadCommands(): void{$commands = $this->app->config->get('console.commands', []);$commands = array_merge($this->defaultCommands, $commands);$this->addCommands($commands);}

注意到$this->app->config->get从console.commands读配置,那配置文件在哪里呢?这就需要回过头来研读一下App.php这个文件了(文章所限,省略掉不重要的代码)

    public function initialize(){......// 加载全局初始化文件$this->load();......}protected function load(): void{......foreach ($files as $file) {$this->config->load($file, pathinfo($file, PATHINFO_FILENAME));}.....}

通过代码得知,程序加载时,即从/config目录下,把所有配置文件都加载进来,console.commands配置项即是console.php配置文件中的commands配置项。那我们就可以知道,聊天相关的对象是在\crmeb\command\Workerman这个类中。

下面来看一下Workerman类的execute方法,workerServer属性与chatWorkerServer长连接对象都是Worker对象实例,这个大家要学一下Workerman的资料了:

protected function execute(Input $input, Output $output){$server = $this->init($input, $output);Worker::$pidFile = app()->getRootPath().'workerman.pid';if(!$server || $server == 'admin'){var_dump('admin');//创建 admin 长连接服务$this->workerServer = new Worker($this->config['admin']['protocol'] . '://' . $this->config['admin']['ip'] . ':' . $this->config['admin']['port']);$this->workerServer->count = $this->config['admin']['serverCount'];}if(!$server || $server == 'chat') {var_dump('chat');//创建 h5 chat 长连接服务$this->chatWorkerServer = new Worker($this->config['chat']['protocol'] . '://' . $this->config['chat']['ip'] . ':' . $this->config['chat']['port']);$this->chatWorkerServer->count = $this->config['chat']['serverCount'];}if(!$server || $server == 'channel') {var_dump('channel');//创建内部通讯服务$this->channelServer = new Server($this->config['channel']['ip'], $this->config['channel']['port']);}$this->bindHandle();try {Worker::runAll();} catch (\Exception $e) {$output->warning($e->getMessage());}}

注意:配置是从$this->config[‘admin’][‘protocol’],查找配置文件的目录workerman.php配置文件包含了这些配置项,配置项是通过config函数来读的,config函数是在/vendor/topthink/framework/src/helper.php文件中,也是用Config类读取配置的

从bindHandle方法中,得知ChatService是接收聊天对话的业务类

    protected function bindHandle(){if(!is_null($this->workerServer)){$server = new WorkermanService($this->workerServer, $this->channelServer);// 连接时回调$this->workerServer->onConnect = [$server, 'onConnect'];// 收到客户端信息时回调$this->workerServer->onMessage = [$server, 'onMessage'];// 进程启动后的回调$this->workerServer->onWorkerStart = [$server, 'onWorkerStart'];// 断开时触发的回调$this->workerServer->onClose = [$server, 'onClose'];}if(!is_null($this->chatWorkerServer)) {$chatServer = new ChatService($this->chatWorkerServer, $this->channelServer);$this->chatWorkerServer->onConnect = [$chatServer, 'onConnect'];$this->chatWorkerServer->onMessage = [$chatServer, 'onMessage'];$this->chatWorkerServer->onWorkerStart = [$chatServer, 'onWorkerStart'];$this->chatWorkerServer->onClose = [$chatServer, 'onClose'];}}

/crmeb/service/workerman/chat/ChatService.php文件中,ChatService类用ChatHandle来进行业务相关操作,对于需要进行二次开发的小白来说,可以修改ChatHandle来完善业务功能,我感觉也可以通过传入的参数调用不同业务对象的功能,这样才能实现灵活扩展的目的。

好了,就聊到这

CRMEB商业版聊天模块的学习(一)相关推荐

  1. 最新人人分销程序V9.9商业版+活动模块/数十套微模板

    正文: 完整演示图放压缩包了有兴趣自己去看吧,因为是长图不好放. 适用范围:人人商城V9.9开源版,新增文章营销功能插件,微擎+微赞通用人人商城分销+补丁 运行环境:php5.2/5.3/5.4+My ...

  2. 智能聊天机器人ChatGPT商业版

    作为一个智能聊天机器人,我是由OpenAI开发的.目前,我的商业版需要通过OpenAI的合作伙伴计划进行许可和部署,以确保我被用于适当的商业用途.如果您对商业使用感兴趣,请联系OpenAI以获取更多信 ...

  3. 全网首发游戏陪玩系统 语音聊天系统11月商业版源码 附教程

    源码简介: 此系统源码包含详细搭建教程及素材图,附搭建教程 源码仅用于学习使用(价值15980元) 此陪玩系统源码本人亲自测试搭建并且运营了一段时间,亲测有效,下方是我测试运营的 下面开始讲讲游戏陪玩 ...

  4. 继天元开源后,旷视又亮出“看家本领”:推出Brain++商业版

    边策 发自 凹非寺  量子位 报道 | 公众号 QbitAI 2020年是AI落地化元年已毋庸置疑.今年4月,国家发改委将人工智能确定作为"新基建"的融合基础设施,支持传统产业转型 ...

  5. 程序设计模式浅析(plain framework商业版设计模式)

    程序设计其实对程序开发者来说十分重要,但是在工作中往往我们却忽略了这一块,因为我们所用的都是现有的模式.一个设计模式的好坏,往往能够体现出程序的专业性,还有整个项目的可持续性.这就是为什么有些公司,在 ...

  6. c gui qt 4编程第二版_一本专门学习PyQt5 GUI编程的书

    Python作为一个开源的解释型编程软件,在教学.科研.实际项目中用得越来越多.Python易学易用,程序资源丰富,在编程解决一些科学计算问题时比较实用,但是Python自带的Tkinter包设计GU ...

  7. 【免费程序分享】Discuz仿手游控游戏论坛商业版网站模板/Discuz游戏论坛网站模板

    本资源可免费获取,请至尾部读阅! Discuz仿手游控游戏论坛商业版网站模板,模板有门户频道和论坛页面,框架代码以及大部分模块代码手工编写,从而减少代码冗余问题,对官方模板文件结构和功能位置做了更为优 ...

  8. RETAS HD更新2009年最终版四模块集成安装包

    RETAS HD更新2009年最终版四模块集成安装包 RETAS!PRO HD 系列是在1993年发布的一套完整的数码动画制作工具,它取代了原先手工制作的塞璐璐与胶片,仅在一台个人电脑上就实现了动画制 ...

  9. 2022年最新CRMEB打通版商城项目简介

    商城介绍 1.项目介绍 CRMEB打通版系统全开源可商用,包含小程序商城.H5商城.公众号商城.PC商城.App,具有分销裂变.拼团.砍价.秒杀.优惠券.抽奖.积分.会员等级.小程序直播.页面DIY等 ...

最新文章

  1. 我的软考之路(九)——总结篇
  2. python如何判断一段代码运行是否超出一定时间,如果超出则抛出异常?(检测函数运行是否超时,规定时间内执行,限制时间)eventlet模块 (eventlet.timeout.Timeout)
  3. 计算机网络协议(一)
  4. 用Axis创建的Webservice的集成与发布
  5. 电脑组装与维护教程_男,78年,懂电脑组装、运营维护青岛地区寻找电脑维护合适岗位...
  6. 三诺+n20g+微型计算机,原来是他?揭秘三诺永恒系列开山鼻祖
  7. 桌面虚拟化之用户评估指南 (翻译)
  8. 走进双亲委派机制LoadClass
  9. VS2017的内存分析
  10. 趋势杀毒软件无法更新
  11. Gantt - attachEvent事件监听 - (必须)拥有返回值事件
  12. 程序员的你不可不知的数据库northwind
  13. 批量查排名的工具有哪些?网站关键词可以优化?
  14. 清华梦的粉碎—写给清华大学的退学申请 /王垠
  15. 行业研究报告-全球与中国白光LED电子皮镜市场现状及未来发展趋势
  16. 爬虫:Xpath定位
  17. 怎样获得网络的最大连通子图
  18. sja1000 c语言,CAN总线控制器SJA1000源程序(c语言).doc
  19. 南京大学计算机课程表,南大课表新鲜出炉,哪个专业课程最多?
  20. 朴素Bayes组合-集成分类器

热门文章

  1. MindManager2020免费中文版使用过问题解答及技巧
  2. 常见操作String的方法(截取子串,分割字符串,字符串的替换)
  3. 数据分析必备的统计学知识(一)
  4. pyqt5 保存文件夹_PyQt5 文件对话框
  5. 现在开网店赚钱吗?怎么开网店?还来得及吗?
  6. 世界排名前3名的Linux桌面系统,快如闪电!立马让老旧电脑变废为宝
  7. 第3周练习 恺撒密码
  8. Linux环境下如何让可执行文件在shell中执行
  9. 查看B站UP开播状态(通过uid查询)
  10. 十进制转二进制(C语言实现)