webstock php,workerman_connection

workerman_connection 测试WebStock 功能

Description

整理PHP 实现webstock 功能的相关流程。感谢workerman 开发作者提供开源组件。

安装 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();

}

逻辑工作原理

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进程退出事件(进程事件)

56e56b160f80f42daab45be263dc4cae.png

执行测试

进入服务器的ws 目录下

php start.php start 这会启动所有服务

启动后截图

198bbee13b27e74089acab8ac53f338b.png

控制台截图

cbc59d748f78f5a855d6e47b1249d9e8.png

里面会生成一个假的OPEN-ID 这个OPEN-ID 用来沟通这个用户的客户端“OPENID_1539063500148”

查看客户端控制台

6922f614d1fc1c15ceffeabc62f683e9.png

看到消息表示测试成功。

特别说明

send_message.php 中的代码实际上放到任何框架下都可以执行,这个完美的进行了解耦操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/273085.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java android 界面设计,Android精美登录界面设计

在网上在到一个登录界面感觉挺不错的,给大家分享一下~先看效果图:这个Demo除了按钮、小猫和Logo是图片素材之外,其余的UI都是通过代码实现的。一、背景背景蓝色渐变,是通过一个xml文件来设置的。代码如下:background_l…

jmeter java接口,jmeter并发测试java接口 | 学步园

Sample这里我用到主要JMeter的线程和报表,扩展了他的“Java请求”这个应用类别。要扩展此应用,要用到lib/ext/ApacheJMeter_java.jar,他封装此应用。首先,需要继承ApacheJMeter_java.jar中的抽象类AbstractJavaSamplerClient,它提…

Web项目练习总结(错误校正篇)

老师布置任务,从SVN上弄个项目来练练手,熟悉下过程。 myeclipse安装SVN 然后把MobileManageSys下下来 然后漫长的等待。。。 然后配置数据库,导入,这里用的是SQLyog,其他的也可以 之后这里会产生一大堆的错误&#xff…

nginx php7提速,nginx+php7-fpm 性能提升几倍跟踪实践结果并优化

nginxphp7-fpm 性能提升几倍跟踪实践结果并优化nginxphp7-fpm 性能提升几倍,跟踪实践结果并优化历史ubuntu服务器使用的apachephp5,现在使用nginuxphp7-fpm方式,看效果图,啥也不说了。强烈推荐升级到php7,当然升级中基…

matlab地球卫星模型,地球卫星三维运行轨道MATLAB仿真

地球卫星三维运行轨道MATLAB仿真1、问题的描述3 轨道上运行的地球卫星,根据牛顿第二定律Fma以及万有引力定律F-GmME*r/r,3可得a-GME*r/r,即x -GME*x/r3 3 y -GME*y/r; z -GM*z/r3E (1)式中,(x,y,z)表示卫星…

php中定义css样式的好处,CSS的优点和缺点分别是什么

CSS的优点有:丰富的样式定义、易于修改、结构清晰、多页面使用等;CSS的缺点:浏览器支持不一样具有兼容性、不能明确指定继承性CSS的主要哦作用是为HTML页面添加样式,使得页面更加美观。接下来在文章中将为大家详细介绍CSS的优点与…

设计模式学习笔记-观察者模式

1. 概述 有时被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。 2. 解决的问题 将一个系统分割…

Handler与多线程

1、Handler介绍 在Android开发中,我们常会使用单独的线程来完成某些操作,比如用一个线程来完成从网络上下的图片,然后显示在一个ImageView上,在多线程操作时,Android中必须保证以下两点: (1&…

oracle语法官方文档,Oracle官方文档必备语法知识

很多Oracle DBA虽然接触Oracle时间很长,但是一旦想不起语法或找不出相应参数时,习惯百度或谷歌。虽然已经下载了官方文档,但是Oracle官方文档必备语法知识[日期:2015-04-21]来源:Linux社区作者:kuqlan[字体…

新中大oracle实列名,新中大财务软件操作流程(完整版)

新中大财务软件最基本的三个模块:核算单位、财务处理系统、报表处理系统。简单地说,核算单位模块是用于建账,财务处理系统用于登账,报表处理系统用于出报表的。一、总账处理系统1、建账套双击财务软件图标 → 在登录界面选择用户编…

linux切换任务命令,Linux top详解之交互命令、命令行选项

top交互命令我们之前说过top是一个交互命令。上一节我们已经遇到了一些命令。这里我们会探索更多的命令。2.1 ‘h’: 帮助首先,我们可以用’h’或者’?’显示交互命令的帮助菜单。2.2 “或者”: 刷新显示top命令默认在一个特定间隔(3秒)后刷新显示。要手动刷新&am…

linux系统硬盘设置密码,LUKS:Linux下磁盘加密

Linux下磁盘加密LUKS(Linux Unified Key Setup)为Linux硬盘加密提供了一种标准,它不仅能通用于不同的Linux发行版本,还支持多用户/口令。因为它的加密密钥独立于口令,所以如果口令失密,我们可以迅速改变口令而无需重新加密真个硬盘…

Hibernate查询

9.1 Hibernate数据查询 数据查询与检索是Hibernate的一个亮点。Hibernate的数据查询方式主要有3种,它们是: l Hibernate Query Language(HQL) l Criteria Query l Native SQL 下面对这3种查询方式分别进…

单例模式 创建对象

两种选择 1 使用pthread_once, once是类的成员变量 只执行一次Create create的作用是创建一个对象 2 使用 static lock 如下所示,注意lock必须是static的,否则是局部变量,每个线程都有自己的lock,无法保证只执行一次。…

opencv配置

OpenCV的简单安装和一次性配置在这里就不赘述了,网上教程很多,可以参考一下这个链接里面的教程http://wenku.baidu.com/view/3b40de25453610661ed9f46b.html。 但是很多情况下面,我们新建一个项目就要重新配置一次OpenCV,那就相当…

linux 动态执行cp,Linux常用命令之cp、mv、rm、cat、more、head、tail、ln命令讲解

上一章节中,我们了解到了Linux系统的最基础的几个文件处理命令,核心的是ls命令,在今天这章中,我们来继续学习Linux对于文件操作相关的一些命令,比如复制、移动、删除、查看等命令。1、cp 命令解释命令名称:…

Linux鼠标回报率修改,鼠标回报率怎么调? 设置鼠标回报率的三种方法

鼠标回报率如何设置呢?鼠标回报率又称刷新率,是指鼠标MCU与电脑传输数据频率。鼠标回报率对于游戏玩家而言至关重要,但同时鼠标回报率与电脑性能息息相关。只有电脑硬件性能良好,才能适当提升鼠标回报率,以实现更高的鼠…

[转载]孙婧妍:高考语文148分是这样炼成的(附:孙婧妍

原文地址:孙婧妍:高考语文148分是这样炼成的(附:孙婧妍2013高考作文《手机论》)作者: 语文新高考高考语文148分是这样炼成的 (附:孙婧妍2013高考作文《手机论》) 来源:网络 作者:孙婧妍…

c语言字符串逆置,字符串逆置

满意答案9n7j5j3m4o2013.12.03采纳率:49% 等级:11已帮助:15198人47911 zxl0714 1358 Accepted 164K 15MS G 0.46K 2007-04-08 10:32:38#include using namespace std;void reverse(char* ch){int i, len;char tmp;len strlen( ch );for (…

【Android基础】Fragment 详解之Fragment介绍

Fragment在Android 3.0( API 11)引入,是为了支持在大屏上显示更加动态、灵活的UI,比如在平板和电视上。Fragment可以看作是嵌套的Activity,类似ActivityGroup,但是开销肯定没有ActivityGroup那么大&#xf…