新闻详情

新闻详情

首页 / 资讯中心 / 详情

ThinkPHP部署Workerman的成功使用示例

发布时间:2026/9/27 23:09:01来源:尧图网络
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往前端推送数据
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Superpowers 从零到一:安装配置与 Java 项目实战指南 2026/9/27 23:57:39

Superpowers 从零到一:安装配置与 Java 项目实战指南

1. 从“superpowers”这个标题说起:它到底是什么第一次看到“superpowers”这个词,很多人脑子里蹦出来的可能是超级英雄、超能力这类概念。但在技术圈和工具圈里,它其实指向一个非常具体的东西——一套围绕代码生成与自动化任务的能力增强方案…

阅读更多 →
CLI-Anything:重新定义命令行的接口契约与插件化操作系统 2026/9/27 23:57:32

CLI-Anything:重新定义命令行的接口契约与插件化操作系统

1. 项目概述:CLI-Anything 不是又一个命令行工具,而是 CLI 范式的重新定义CLI-Anything 这个名字乍看像极了某个开源项目的代号,但如果你在终端里敲下cli-any或者anything-cli却找不到可执行文件,别急——它根本就不是传统意义上需…

阅读更多 →
【STM32】数电期末核心知识点速览 2026/9/27 23:57:25

【STM32】数电期末核心知识点速览

数电期末知识笔记 一、核心知识点总结 知识点内容逻辑门与门、或门、非门、与非门、或非门、异或门、同或门等基本逻辑门的真值表和功能逻辑代数布尔代数的基本定律(如交换律、结合律、分配律)、反函数式、对偶式数制转换二进制、八进制、十进制、十六…

阅读更多 →
using-lwc - code-graph 2026/9/27 23:57:06

using-lwc - code-graph

LWC CodeGraph 索引 使用时机 对已检出代码的结构性问题使用 CodeGraph:符号定义、签名、调用者/被调用者、依赖流、文件拓扑、可达性,或跨符号/文件的变更影响。 跳过时机 对于单文件字面编辑、仅格式化工作、仅文档/配置工作、注释/日志字符串&#xf…

阅读更多 →
Github周刊2026W37:用更少认知负荷换取更高产出效率的五个开发实践 2026/9/27 23:56:59

Github周刊2026W37:用更少认知负荷换取更高产出效率的五个开发实践

1. 这期周刊到底在聊什么先说清楚,这不是一篇翻译稿,也不是简单的链接罗列。Github周刊2026W37这一期,我翻来覆去看了三遍,最大的感受是:它把当下开发者圈子里几个看似不搭界的热点,用一条暗线串起来了——…

阅读更多 →
Tencent BrowserSkill:已登录浏览器与编码Agent的本地桥接方案 2026/9/27 23:56:59

Tencent BrowserSkill:已登录浏览器与编码Agent的本地桥接方案

1. 这个项目到底在解决什么问题先说结论:Tencent BrowserSkill 做的事情,用一句话概括就是——在“已经登录了各种账号的真实浏览器”和“跑在终端里的编码 Agent”之间,架一座本地桥。让 Agent 不用重新登录、不用重新配置 Cookie、不用去啃…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉