与ThinkPHP等框架结合

使用GatewayWorker时开发者最关心的是如何与现有mvc框架(ThinkPHP Yii laravel等)整合,以下是官方推荐的整合方式。见示意图:

总体原则:

现有mvc框架项目与GatewayWorker独立部署互不干扰

所有的业务逻辑都由网站页面post/get到mvc框架中完成

GatewayWorker不接受客户端发来的数据,即GatewayWorker不处理任何业务逻辑,GatewayWorker仅仅当做一个单向的推送通道

仅当mvc框架需要向浏览器主动推送数据时才在mvc框架中调用Gateway的API GatewayClient完成推送。

GatewayClient安装

具体实现步骤

1、网站页面建立与GatewayWorker的websocket连接

2、GatewayWorker发现有页面发起连接时,将对应连接的client_id发给网站页面

3、网站页面收到client_id后触发一个ajax请求(假设是bind.php)将client_id发到mvc后端

4、mvc后端bind.php收到client_id后利用GatewayClient调用Gateway::bindUid($client_id, $uid)将client_id与当前uid(用户id或者客户端唯一标识)绑定。如果有群组、群发功能,也可以利用Gateway::joinGroup($client_id, $group_id)将client_id加入到对应分组

5、页面发起的所有请求都直接post/get到mvc框架统一处理,包括发送消息

6、mvc框架处理业务过程中需要向某个uid或者某个群组发送数据时,直接调用GatewayClient的接口Gateway::sendToUid Gateway::sendToGroup 等发送即可

示例代码

GatewayWorker中Events.php代码(只有个onConnect回调设置)

use \GatewayWorker\Lib\Gateway;

class Events{

// 当有客户端连接时,将client_id返回,让mvc框架判断当前uid并执行绑定

public static function onConnect($client_id){

Gateway::sendToClient($client_id, json_encode(array(

'type' => 'init',

'client_id' => $client_id

)));

}

// GatewayWorker建议不做任何业务逻辑,onMessage留空即可

public static function onMessage($client_id, $message){

}

}

网站页面js片段

/**

* 与GatewayWorker建立websocket连接,域名和端口改为你实际的域名端口,

* 其中端口为Gateway端口,即start_gateway.php指定的端口。

* start_gateway.php 中需要指定websocket协议,像这样

* $gateway = new Gateway(websocket://0.0.0.0:7272);

*/

ws = new WebSocket("ws://your_domain.com:7272");

// 服务端主动推送消息时会触发这里的onmessage

ws.onmessage = function(e){

// json数据转换成js对象

var data = eval("("+e.data+")");

var type = data.type || '';

switch(type){

// Events.php中返回的init类型的消息,将client_id发给后台进行uid绑定

case 'init':

// 利用jquery发起ajax请求,将client_id发给后端进行uid绑定

$.post('./bind.php', {client_id: data.client_id}, function(data){}, 'json');

break;

// 当mvc框架调用GatewayClient发消息时直接alert出来

default :

alert(e.data);

}

};

mvc后端uid绑定代码片段

bind.php (利用GatewayClient绑定)

//加载GatewayClient。关于GatewayClient参见本页面底部介绍

require_once '/your/path/GatewayClient/Gateway.php';

// GatewayClient 3.0.0版本开始要使用命名空间

use GatewayClient\Gateway;

// 设置GatewayWorker服务的Register服务ip和端口,请根据实际情况改成实际值(ip不能是0.0.0.0)

Gateway::$registerAddress = '127.0.0.1:1236';

// 假设用户已经登录,用户uid和群组id在session中

$uid = $_SESSION['uid'];

$group_id = $_SESSION['group'];

// client_id与uid绑定

Gateway::bindUid($client_id, $uid);

// 加入某个群组(可调用多次加入多个群组)

Gateway::joinGroup($client_id, $group_id);

mvc后端发消息代码片段

send_message.php (利用GatewayClient发送)

//加载GatewayClient。关于GatewayClient参见本页面底部介绍

require_once '/your/path/GatewayClient/Gateway.php';

// GatewayClient 3.0.0版本开始要使用命名空间

use GatewayClient\Gateway;

// 设置GatewayWorker服务的Register服务ip和端口,请根据实际情况改成实际值(ip不能是0.0.0.0)

Gateway::$registerAddress = '127.0.0.1:1236';

// 向任意uid的网站页面发送数据

Gateway::sendToUid($uid, $message);

// 向任意群组的网站页面发送数据

Gateway::sendToGroup($group, $message);

注意

以上仅是mvc框架与GatewayWorker官方推荐的结合方式,并不是强制使用此方式,开发者可以自由变化选择结合方式以适应自己的业务需求。

当然也可以采用客户端与GatewayWorker直接双向通讯的方式完成业务通讯。

关于GatewayClient

源码:

注意:

如果GatewayClient和GatewayWorker不是在同一台服务器上,则需要先将start_gateway.php中的lanIp改成当前服务器的内网ip(如果不在一个内网可改成公网ip)。

如果GatewayClient和GatewayWorker在同一台服务器上运行,则不用做任何更改,直接按照示例使用GatewayClient即可。

通过GatewayClient发送的数据不会经过Event.php,而是直接经由Gateway进程转发给客户端。

GatewayClient无法接收客户端发来的数据。

客户端使用示例

require_once '/your/path/GatewayClient/Gateway.php';

/**

* gatewayClient 3.0.0及以上版本加了命名空间

* 而3.0.0以下版本不需要use GatewayClient\Gateway;

**/

use GatewayClient\Gateway;

/**

*====这个步骤是必须的====

*这里填写Register服务的ip和Register端口,注意端口不是gateway端口

*ip不能是0.0.0.0,端口在start_register.php中可以找到

*这里假设GatewayClient和Register服务都在一台服务器上,ip填写127.0.0.1。

*如果不在一台服务器则填写真实的Register服务的内网ip(或者外网ip)

**/

Gateway::$registerAddress = '127.0.0.1:1236';

// 以下是调用示例,接口与GatewayWorker环境的接口一致

// 接口具体使用方法见《Lib\Gateway类提供的接口》一章

// 注意除了不支持sendToCurrentClient和closeCurrentClient方法

// 其它方法都支持

Gateway::sendToAll($data);

Gateway::sendToClient($client_id, $data);

Gateway::closeClient($client_id);

Gateway::isOnline($client_id);

Gateway::bindUid($client_id, $uid);

Gateway::isUidOnline($uid);

Gateway::getClientIdByUid($uid);

Gateway::unbindUid($client_id, $uid);

Gateway::sendToUid($uid, $data);

Gateway::joinGroup($client_id, $group);

Gateway::sendToGroup($group, $data);

Gateway::leaveGroup($client_id, $group);

Gateway::getClientCountByGroup($group);

Gateway::getClientSessionsByGroup($group);

Gateway::getAllClientCount();

Gateway::getAllClientSessions();

Gateway::setSession($client_id, $session);

Gateway::updateSession($client_id, $session);

Gateway::getSession($client_id);

...

php thikn_与ThinkPHP等框架结合相关推荐

  1. ThinkPHP核心框架目录结构

    文件路径 文件描述 \index.php 入口文件 \Application 应用目录 \Public 资源文件目录 \ThinkPHP 框架核心目录 \Application目录结构(应用目录,保存 ...

  2. ThinkPHP 5 框架实现多语言 实例讲解

    ThinkPHP 5 框架实现多语言 今天给大家分享一篇tp5框架多语言的实例 第一步: 您需要在配置文件中开启网站多语言, 并添加语言允许列表: // 默认语言'default_lang' => ...

  3. 美容院 php源代码,基于ThinkPHP+B-JUI框架开发的微信美容院SPA预约消费管理系统PHP源码...

    源码介绍 微信美容院预约消费管理系统是基于ThinkPHP3.2.3+B-JUI1.2框架开发,权限管理运用了Auth类进行权限认证,权限可以细分到每个操作功能,增删改查功能一应俱全,整合了PHPEx ...

  4. Laravel和Thinkphp有什么区别,哪个框架好用

    Laravel和Thinkphp这两个php框架对于php程序员都不陌生,新手可能对Thinkphp比较熟,也是国内比较出名的开源框架,更高级的Laravel一般有点经验的才使用. TP框架: Thi ...

  5. ThinkPHP 集成 PHPUnit 8 测试框架进行单元测试

    ThinkPHP 5.1 集成 PHPUnit 8 测试框架 本项目仅适用于运行 PHP7.2 以上的环境!对于低版本 PHP 请根据需要调整 PHPUnit 的版本! 声明 由于原项目 think- ...

  6. 【ThinkPHP系列篇】ThinkPHP框架的介绍和搭建(一)

    各位博友好,最近博主学了关于ThinkPHP的一些基本操作,感觉很有收获,所以作为小白的我想与大家分享一些关于ThinkPHP的搭建及基本操作,感觉更适合初学者来学习,当然也希望大牛们能够给小白我提出 ...

  7. php 框架获取服务器,Thinkphp 框架基础之源码获取、环境要求与目录结构分析

    本文实例讲述了Thinkphp 框架基础之源码获取.环境要求与目录结构.分享给大家供大家参考,具体如下: 获取ThinkPHP 获取ThinkPHP的方式很多,官方网站(http://thinkphp ...

  8. php larve,封装composer包,实现thinkphp、larverl、yii框架中使用(使用框架实现回调方法)...

    完美解决在 event 里面 ,onmessage 里面如何 嵌入 thinkphp,使用框架实现回调方法 1.安装[code]composer require tinymeng/worker-soc ...

  9. WSTMart多商户商城跟随thinkphp框架升级到5.0.3

    THINKPHP最近是喜闻不断,先是在大好中秋给PHP 开发者最好的礼物,推出了5.0正式版,然后在国庆前推出5.0.1版本,继而在程序员节发布5.0.2,双11又推出了新的版本5.0.3 ... . ...

最新文章

  1. java二个整数相减_Java-消息框显示两整数加减乘除
  2. Python中threading的join和setDaemon的区别及用法
  3. 2012年度最新免费web开发设计资源荟萃
  4. 必须使用初始化列表的情况
  5. 这个火热的社区都升级到2.0了,你还不知道它?
  6. hbase 查询固定条数_HBase统计表行数(RowCount)的四种方法
  7. springboot+postsql 做接口api
  8. python图像手绘效果_python 3.6实现图像的手绘效果
  9. 之前招的当老板了,阿里拍卖急需前端!!!
  10. C++定义点和矩形求矩形面积周长
  11. python爬虫beautifulsoup爬取小说_Python3网络爬虫(七):使用Beautiful Soup爬取小说
  12. P5144 蜈蚣 (线性DP)
  13. 51 nod 2070 最小罚款
  14. 家用路由器技术深入剖解
  15. API 接口大全之 1688
  16. 利用FME PythonCaller调用7z解压压缩包
  17. python excel画图
  18. 笔记本电脑如何用c语言开无线网卡,笔记本电脑无线上网卡怎么用 笔记本电脑无线上网卡使用方法...
  19. 2021年中国LED驱动器(LED照明驱动器)市场趋势报告、技术动态创新及2027年市场预测
  20. 戏子多秋用计算机怎么弹,戏子多秋 - 刘雨Key - 5SING中国原创音乐基地

热门文章

  1. CCF 201503-1 图像旋转
  2. js 数字序号 转 字母序号
  3. Git 的安装及配置
  4. Q#–一个新年愿望清单
  5. C#LeetCode刷题之#590-N叉树的后序遍历(N-ary Tree Postorder Traversal)
  6. 使用react开发管理后台
  7. 使用React,TypeScript和Socket.io构建聊天应用
  8. css网格_CSS网格初学者指南
  9. 停在Z的危险:用苏斯博士的话,为什么孩子应该编码
  10. idea怎么把代码放到git_在IntelliJ IDEA中同步代码到华为云git仓库 (on windows)