# workerman_connection **Repository Path**: kami1983/workerman_connection ## Basic Information - **Project Name**: workerman_connection - **Description**: 整理PHP 实现webstock 功能的相关流程。 - **Primary Language**: PHP - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2018-10-09 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # workerman_connection 测试WebStock 功能 #### Description 整理PHP 实现webstock 功能的相关流程。感谢workerman 开发作者提供开源组件。 参考网站:http://www.workerman.net/ #### 安装 composer ``` # curl -sS https://getcomposer.org/installer | php ``` #### 如果安装 composer 提示PHP 版本不够按照如下处理,否则跳过。 * 提示版本不够,现在是5.3.3 只好准备升级到5.6 ``` 先进行卸载旧版本。 # yum list installed | grep php # yum remove php.x86_64 php-cli.x86_64 php-common.x86_64 php-fpm.x86_64 php-gd.x86_64 php-mbstring.x86_64 php-mcrypt.x86_64 php-mysql.x86_64 php-pdo.x86_64 php-xml.x86_64 删掉显示出来的所有组件 ``` * 接下来安装PHP5.6 ``` # rpm -Uvh https://mirror.webtatic.com/yum/el6/latest.rpm 升级一下yum 工具 # yum clean all 清除 # yum install php56w.x86_64 php56w-cli.x86_64 php56w-common.x86_64 php56w-fpm.x86_64 php56w-gd.x86_64 php56w-ldap.x86_64 php56w-mbstring.x86_64 php56w-mcrypt.x86_64 php56w-mysql.x86_64 php56w-pdo.x86_64 php56w-xml.x86_64 ``` * 验证安装版本 ``` # php -v (显示 5.6.35) # /etc/init.d/php-fpm restart 重新启动 ``` #### 安装WebStock 所需要的组件 * 安装前检查很重要 ``` # curl -Ss http://www.workerman.net/check.php|php 检查缺啥 PHP Version >= 5.3.3 [OK] Extension pcntl check [OK] Extension posix check [fail] (缺啥补啥) ``` * 补充缺少的部分 ``` # yum install php56w-process 安装缺少的 posix # mv composer.phar /usr/local/bin/composer 让命令全局调用 # cd (切换到项目目录) ``` * 安装:workerman ``` # composer require workerman/workerman ``` * 安装:gateway-worker ``` # composer require workerman/gateway-worker ``` #### 代码测试 * 下载本项目的文件,这里假设你防止的目录是网站根目录下 ws 文件夹中。 #### 配置 * 配置 ws/start_businessworker.php BusinessWorker类其实也是基于基础的Worker开发的。BusinessWorker是运行业务逻辑的进程,BusinessWorker收到Gateway转发来的事件及请求时会默认调用Events.php中的onConnect、onMessage、onClose方法处理事件及数据,开发者正是通过实现这些回调控制业务及流程。 * $worker->name 是你的工作进程名称,随便起名即可别重名 * $worker->registerAddress 是webstock 服务器的地址,目标指向你的webstock 服务器,这个在分布式处理需要注意,这里都在一台主机上测试,所以IP为127.0.0.1 * 其他不用改,不要动,保存退出 * 举例 ``` use \Workerman\Worker; use \Workerman\WebServer; use \GatewayWorker\Gateway; use \GatewayWorker\BusinessWorker; use \Workerman\Autoloader; // bussinessWorker 进程 $worker = new BusinessWorker(); // worker名称 $worker->name = 'YourAppBusinessWorker'; // bussinessWorker进程数量 $worker->count = 4; // 服务注册地址 $worker->registerAddress = '127.0.0.1:2346'; // 如果不是在根目录启动,则运行runAll方法 if(!defined('GLOBAL_START')) { Worker::runAll(); } ``` * 配置 ws/start_gateway.php Gateway类用于初始化Gateway进程。Gateway进程是暴露给客户端的让其连接的进程。所有客户端的请求都是由Gateway接收然后分发给BusinessWorker处理 * $gateway->name * $gateway->count * $gateway->lanIp * $gateway->startPort * $gateway->registerAddress * $gateway->pingInterval * $gateway->pingData * 直接看注释吧。 ``` use \Workerman\Worker; use \Workerman\WebServer; use \GatewayWorker\Gateway; use \GatewayWorker\BusinessWorker; use \Workerman\Autoloader; // gateway 进程,这里使用Text协议,可以用telnet测试 $gateway = new Gateway("websocket://0.0.0.0:2345"); // gateway名称,status方便查看 $gateway->name = 'YourAppGateway'; // gateway进程数 $gateway->count = 4; // 本机ip,分布式部署时使用内网ip $gateway->lanIp = '127.0.0.1'; // 内部通讯起始端口,假如$gateway->count=4,起始端口为4000 // 则一般会使用4000 4001 4002 4003 4个端口作为内部通讯端口 $gateway->startPort = 2900; // 服务注册地址 $gateway->registerAddress = '127.0.0.1:2346'; // 心跳间隔 $gateway->pingInterval = 20; // 心跳数据 $gateway->pingData = '{"type":"ping"}'; ``` * 配置 ws/start_register.php Register类其实也是基于基础的Worker开发的。Gateway进程和BusinessWorker进程启动后分别向Register进程注册自己的通讯地址,Gateway进程和BusinessWorker通过Register进程得到通讯地址后,就可以建立起连接并通讯了。 * 要修改的只有text 协议地址,这里面要和 ``` use \Workerman\Worker; use \GatewayWorker\Register; // register 服务必须是text协议 $register = new Register('text://0.0.0.0:2346'); // 如果不是在根目录启动,则运行runAll方法 if(!defined('GLOBAL_START')) { Worker::runAll(); } ``` #### 逻辑工作原理 * 摘抄自官网 http://doc2.workerman.net/principle.html 1.Register、Gateway、BusinessWorker进程启动 2.Gateway、BusinessWorker进程启动后向Register服务进程发起长连接注册自己 3.Register服务收到Gateway的注册后,把所有Gateway的通讯地址保存在内存中 4.Register服务收到BusinessWorker的注册后,把内存中所有的Gateway的通讯地址发给BusinessWorker 5.BusinessWorker进程得到所有的Gateway内部通讯地址后尝试连接Gateway 6.如果运行过程中有新的Gateway服务注册到Register(一般是分布式部署加机器),则将新的Gateway内部通讯地址列表将广播给所有BusinessWorker,BusinessWorker收到后建立连接 7.如果有Gateway下线,则Register服务会收到通知,会将对应的内部通讯地址删除,然后广播新的内部通讯地址列表给所有BusinessWorker,BusinessWorker不再连接下线的Gateway 8.至此Gateway与BusinessWorker通过Register已经建立起长连接 9.客户端的事件及数据全部由Gateway转发给BusinessWorker处理,BusinessWorker默认调用Events.php中的onConnect onMessage onClose处理业务逻辑。 10.BusinessWorker的业务逻辑入口全部在Events.php中,包括onWorkerStart进程启动事件(进程事件)、onConnect连接事件(客户端事件)、onMessage消息事件(客户端事件)、onClose连接关闭事件(客户端事件)、onWorkerStop进程退出事件(进程事件) ![输入图片说明](https://images.gitee.com/uploads/images/2018/1009/144229_c41e5514_131036.png "屏幕截图.png") #### 执行测试 * 进入服务器的ws 目录下 * php start.php start 这会启动所有服务 * 启动后截图 ![输入图片说明](https://images.gitee.com/uploads/images/2018/1009/145859_fb8a2825_131036.png "屏幕截图.png") * 浏览器访问 http://你的域名/ws/Applications/YourApp/index.html 这时候打开控制台 * 控制台截图 ![输入图片说明](https://images.gitee.com/uploads/images/2018/1009/150022_fa6999e3_131036.png "屏幕截图.png") * 里面会生成一个假的OPEN-ID 这个OPEN-ID 用来沟通这个用户的客户端“OPENID_1539063500148” * 模拟在另外的浏览器上给这个客户端发送一个消息。http://hx2.hztc.dev.kaitianad.com/ws/Applications/YourApp/send_message.php?uid=OPENID_1539063500148&msg=hellolinhai * 查看客户端控制台 ![输入图片说明](https://images.gitee.com/uploads/images/2018/1009/150248_e9a833b6_131036.png "屏幕截图.png") * 看到消息表示测试成功。 #### 特别说明 send_message.php 中的代码实际上放到任何框架下都可以执行,这个完美的进行了解耦操作。