首页/新闻资讯/正文详情

ThinkPHP部署Workerman的成功使用示例

发布时间:2026/9/27 23:09:02 来源:云帆数科 栏目:资讯中心
ThinkPHP部署Workerman的成功使用示例
本文介绍thinkphp中关于composer集成workerman的方法并解决了安装过程 中遇到的错误实现了和woerkman进行握手和通信的demo。用户可以在此基础上按自己的逻辑实现一个聊天系统或者客服系统。一、安装扩展包 composer require topthink/think-worker直接执行composer require topthink/think-worker1.0.* 即可成功二、新建 server.php123456#!/usr/bin/env php?phpdefine(APP_PATH, __DIR__ ./application/);define(BIND_MODULE,push/Worker);// 加载框架引导文件require__DIR__ ./thinkphp/start.php;三、新建Worker.phpphp think make:controller push/Worker即可将里面的内容替换如下所示123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475?phpnamespaceapp\push\controller;usethink\Controller;usethink\Request;usethink\worker\Server;usethink\Cache;classWorkerextendsServer{protected$socketwebsocket://0.0.0.0:2346;protected$processes 1;protected$uidConnectionsarray();static$count 0;/*** 收到信息* param $connection* param $data*/publicfunctiononMessage($connection,$data){$retdatajson_decode($data,true);$uid$retdata[id];$message$retdata[msg];if(isset($this-uidConnections[$uid])){$connection$this-uidConnections[$uid];$connection-send($message);// return true;}$connection-send(我收到你的信息了333.$retdata[msg]);}/*** 当连接建立时触发的回调函数* param $connection*/publicfunctiononConnect($connection){$this-uidConnections[$connection-id] $connection;$connection-send(你连接了我.$connection-id);}// 针对uid推送数据publicfunctionsendMessageByUid($uid,$message){if(isset($this-uidConnections[$uid])){$connection$this-uidConnections[$uid];$connection-send($message);returntrue;}returnfalse;}/*** 当连接断开时触发的回调函数* param $connection*/publicfunctiononClose($connection){}/*** 当客户端的连接上发生错误时触发* param $connection* param $code* param $msg*/publicfunctiononError($connection,$code,$msg){echoerror $code $msg\n;}/*** 每个进程启动* param $worker*/publicfunctiononWorkerStart($worker){}}四、执行 php server.php start遇到禁用函数就去对应的PHP里面把禁用函数删除 此命令可以放到Supervisor的守护进程里面去并且查看端口是否运行宝塔里面也要放行对应的端口 2346测试远程连接 telnet localhost 2346 localhost改成外网ip即可这个走通了前端就能直接连接了linux 退出Telnet命令 先输入命令CTRL]然后再输入命令quit五、前端代码1234567891011121314151617181920!DOCTYPE htmlhtml langenheadmeta http-equivContent-Typecontenttext/html; charsetutf-8/titleTitle/title/headbodyscriptws newWebSocket(ws://118.**.***.207:2346);ws.onopen function() {console.log(连接成功);ws.send(tom);console.log(给服务端发送一个字符串tom);};ws.onmessage function(e) {console.log(收到服务端的消息 e.data);};/script/body/html六、前端开两个端口即可进行相互通讯1ws.send({id:2,msg:21111111111110});重点在这因为在这里需要用到服务端给客户端推送用到了text服务WorkerMan中php后端及时推送消息给客户端原理1、建立一个websocket Worker用来维持客户端长连接2、websocket Worker内部建立一个text Worker3、websocket Worker 与 text Worker是同一个进程可以方便的共享客户端连接4、某个独立的php后台系统通过text协议与text Worker通讯5、text Worker操作websocket连接完成数据推送代码及步骤123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384//push.php?phpuseWorkerman\Worker;require_once./vendor/workerman/workerman/Autoloader.php;// 初始化一个worker容器监听1234端口$workernewWorker(websocket://0.0.0.0:1234);///** 注意这里进程数必须设置为1否则会报端口占用错误* (php 7可以设置进程数大于1前提是$inner_text_worker-reusePorttrue)*/$worker-count 1;// worker进程启动后创建一个text Worker以便打开一个内部通讯端口$worker-onWorkerStart function($worker){// 开启一个内部端口方便内部系统推送数据Text协议格式 文本换行符$inner_text_workernewWorker(text://0.0.0.0:5678);$inner_text_worker-onMessage function($connection,$buffer){// $data数组格式里面有uid表示向那个uid的页面推送数据$data json_decode($buffer, true);$uid$data[uid];// 通过workerman向uid的页面推送数据$ret sendMessageByUid($uid,$buffer);// 返回推送结果$connection-send($ret?ok:fail);};// $connection-send(你好,你连接我了);// ## 执行监听 ##$inner_text_worker-listen();};// 新增加一个属性用来保存uid到connection的映射$worker-uidConnections array();// 当有客户端发来消息时执行的回调函数$worker-onMessage function($connection,$data){$datajson_decode($data,true);$connection-send(99897);global$worker;// 判断当前客户端是否已经验证,既是否设置了uidif(!isset($connection-uid)){// 没验证的话把第一个包当做uid这里为了方便演示没做真正的验证$connection-uid $data[id];/* 保存uid到connection的映射这样可以方便的通过uid查找connection* 实现针对特定uid推送数据*/$worker-uidConnections[$connection-uid] $connection;$connection-send(9980.$data[msg]);return;}else{$connection-send(998123);}};// 当有客户端连接断开时$worker-onClose function($connection){global$worker;if(isset($connection-uid)){// 连接断开时删除映射unset($worker-uidConnections[$connection-uid]);}};// 向所有验证的用户推送数据functionbroadcast($message){global$worker;foreach($worker-uidConnectionsas$connection){$connection-send($message);}}// 针对uid推送数据functionsendMessageByUid($uid,$message){global$worker;if(isset($worker-uidConnections[$uid])){$connection$worker-uidConnections[$uid];$connection-send($message);returntrue;}returnfalse;}运行所有的workerWorker::runAll();启动后端服务 php push.php start -d前端接收推送的js代码123456789101112131415161718192021!DOCTYPE htmlhtmllangenheadmetahttp-equivContent-Typecontenttext/html; charsetutf-8/titleTitle/title/headbodyscriptvar ws new WebSocket(ws://118.**.**.207:1234);ws.onopen function(){var uid uid1;ws.send(uid);console.log(给服务端发送一个字符串uid);};ws.onmessage function(e){// alert(e.data);console.log(收到服务端的消息 e.data);};/script/body/html后端推送消息的代码12345678// 建立socket连接到内部推送端口$client stream_socket_client(tcp://127.0.0.1:5678,$errno,$errmsg, 1);// 推送的数据包含uid字段表示是给这个uid推送$dataarray(uiduid1,percent88%);// 发送数据注意5678端口是Text协议的端口Text协议需要在数据末尾加上换行符fwrite($client, json_encode($data).\n);// 读取推送结果echofread($client, 8192);后端推送消息的代码和push.php监听同一个端口push.php和前端监听同一个websocket端口通过后端推送消息的代码向push.php推送数据,push.php接受到数据后通过处理 利用websocket往前端推送数据

相关推荐

pink老师JS配套资料实战指南:解压即跑、避坑进阶
pink老师JS配套资料实战指南:解压即跑、避坑进阶

简介:本资源是pink老师JavaScript全系列视频课程的配套学习资料包,面向前端初学者与转行新人,系统解决JS核心概念理解难、代码实践缺引导、知识体系不连贯等常见学习痛点。压缩包共201个文件,包含150个可直接运行的HTML示例页&… · 2026/9/27 23:09:02

AD717X多通道ADC驱动源码解析与嵌入式实战
AD717X多通道ADC驱动源码解析与嵌入式实战

简介:这份资源面向嵌入式开发工程师与精密数据采集方向的开发者,提供AD717X系列多路复用模数转换器的C语言驱动源码,覆盖AD7172-2、AD7172-4、AD7173-8、AD7175-2、AD7175-8、AD7176-2及AD7177-2等多款芯片,可用于工业测量、称重、… · 2026/9/27 23:09:02

RAG实战:本地知识库检索与LLM微调智能问答系统源码解析
RAG实战:本地知识库检索与LLM微调智能问答系统源码解析

简介:本资源面向希望深入理解检索增强生成(RAG)与本地知识库问答的开发者与算法学习者,提供一套基于本地知识库检索结合LLM微调的智能问答系统完整实战方案,帮助解决通用大模型在垂直领域回答不精准、知识更新滞后的问… · 2026/9/27 23:09:02

treg:轻量级终端正则调试工具,纯Go编写,离线可用
treg:轻量级终端正则调试工具,纯Go编写,离线可用

1. 项目概述:Treg 不是缩写,而是真实存在的开源 CLI 工具最近在多个开发者社区和终端工具讨论区里,“treg”这个词频繁出现,但很多人第一反应是——这会不会是 T-Regulatory cell(调节性T细胞)的缩写&#… · 2026/9/27 23:47:21

耒阳市古雍网站建设店新手入门:网站被黑挂马3招急救
耒阳市古雍网站建设店新手入门:网站被黑挂马3招急救

耒阳市古雍网站建设店新手入门:网站被黑挂马3招急救 昨晚11点,手机突然弹出一条短信,说你的网站出现了非法内容。你慌了,打开浏览器一看,首页赫然挂着博彩广告,后台登录密码也被重置了。这时候,新手最容易犯的错误就是立刻删库重装,结果数据全丢,… · 2026/9/27 23:47:21

Python程序打包实战:PyInstaller与Kivy打包EXE和APK全指南
Python程序打包实战:PyInstaller与Kivy打包EXE和APK全指南

1. 从脚本到可执行文件:为什么打包这件事值得认真对待写过Python的人大概都有过这样的经历:本地跑得好好的脚本,发给同事或者朋友,对方一句“我电脑上没装Python”就把你堵回来了。尤其是做一些小工具、自动化脚本、爬虫可视化界面… · 2026/9/27 23:47:08

智慧养老微信小程序源码实战:从环境搭建到核心模块二次开发
智慧养老微信小程序源码实战:从环境搭建到核心模块二次开发

简介:这是一套面向高校计算机及相关专业学生的智慧养老微信小程序毕业设计源码,采用JavaScript开发,已通过指导教师审核并获优秀评价,适合用作毕业设计课题、课程实践或学期综合作业。项目聚焦养老服务数字化场景,涵盖… · 2026/9/27 23:47:02

模型部署工程师必知:CUDA编程模型与GPU架构对推理性能的核心影响
模型部署工程师必知:CUDA编程模型与GPU架构对推理性能的核心影响

1. 从一次推理延迟异常说起:为什么部署工程师必须懂CUDA模型部署与推理优化这个系列写到第五篇,前面几篇聊了量化、算子融合、显存管理这些偏上层的东西。但说实话,如果你对底层的CUDA编程模型和GPU硬件架构没有基本认知,很多优化… · 2026/9/27 23:47:02

网络舆情分析的免费网站完整流程
网络舆情分析的免费网站完整流程

5个免费工具搞定网络舆情分析网站搭建 网站被黑挂马不知道怎么办?别慌,先别急着删库。很多运营同学一遇到页面弹出博彩广告、链接指向境外服务器,第一反应就是重装系统。这恰恰是最浪费时间的做法。真正的解法不是“堵”,而是“疏”和“查”。你需要一套… · 2026/9/27 23:47:02

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码