测试所用PHP版本为5.4;参考GatewayWorker手册:http://doc2.workerman.net
百度中发现TP整合GatewayWorke的都是3.2或更高版本的,因为自己做的项目都是基于3.1.2的,所以记录下,用于以后项目搭建所用。
windows和linux的搭建访问都差不多,笔者因用windows的,所以为了方便就直接在windows开发,因服务器用的是linux,开发完后,最终还是需要整合到linux上的。
一、下载GatewayWorker官方demo,直接通过GatewayWorker手册的序言就能找到相应的demo下载
二、解压到任意位置
三、进入php安装目录(官方是运行start_for_win.bat直接启动的,但自己的电脑没有运行成功,可能因为某些配置没有配吧,反正懒的搞,就用cmd直接运行了)
四、打开"cmd"
五、运行如下代码
php D:\phpStudy\PHPTutorial\WWW\XXX\GatewayWorker\Applications\YourApp\start_register.php D:\phpStudy\PHPTutorial\WWW\XXX\GatewayWorker\Applications\YourApp\start_gateway.php D:\phpStudy\PHPTutorial\WWW\XXX\GatewayWorker\Applications\YourApp\start_businessworker.php
以上的D:\phpStudy\PHPTutorial\WWW\XXX是我放GatewayWorker的路径,这里你可以放到你的TP项目根目录即可
如果运行报错,请把php.exe的路径加到环境变量中
出现如下同,说明GatewayWorker已经运行
六、新开几个cmd命令行窗口运行 telnet 127.0.0.1 8282,输入任意字符即可聊天(非本机测试请将127.0.0.1替换成实际ip)。
七、开始整合tp项目(这里假设你的TP项目放在D:\phpStudy\PHPTutorial\WWW\XXX,并绑定了xp.xxx.cn为访问域名),整合原理可参考:http://doc2.workerman.net/326107
八、下载GatewayClient:https://github.com/walkor/GatewayClient
九、把解压后的GatewayClient目录放到Lib/Plugin目录下(我这里把GatewayClient放到了Lib/Plugin,你们可以放到其它目录,只要在后面调用的时候路径改成你们对应的路径即可);然后把Gateway.php改名为Gateway.class.php
十、修改GatewayWorker\Applications\YourApp\Events.php文件,只要修改onConnect方法即可,其它2个方法可以删除
public static function onConnect($client_id)
{
Gateway::sendToClient($client_id, json_encode(array(
'type' => 'init',
'client_id' => $client_id
)));
}
十一、修改GatewayWorker\Applications\YourApp\start_gateway.php第24行,改成
$gateway = new Gateway("websocket://0.0.0.0:8282");
运行第五步方法,如果GatewayWorker刚才没有退出,请按ctrl+c退出,然后再运行
十二、写模板页index.html
<!-- 这是引用了jq文件,请修改为自己的jq存放路径 -->
<script src="__PUBLIC__/bootstrap/js/jquery-1.7.2.min.js"></script>
<ul>
</ul>
<label>发送给:<input id="uid" value="1" ></label>
<label>内容:<textarea id="nr"></textarea></label>
<button type="button" id="send" >发送</button>
<script type="text/javascript">
/**
* 与GatewayWorker建立websocket连接,域名和端口改为你实际的域名端口,
* 其中端口为Gateway端口,即start_gateway.php指定的端口。
* start_gateway.php 中需要指定websocket协议,像这样
* $gateway = new Gateway(websocket://0.0.0.0:7272);
*/
ws = new WebSocket("ws://"+document.domain+":8282");
ws.onopen=function (ev) {
console.log('上线');
}
ws.onerror=function(e){
console.log(e);
}
ws.onclose=function(e){
console.log('下线');
}
// 服务端主动推送消息时会触发这里的onmessage
ws.onmessage = function(e){
console.log(e.data);
// json数据转换成js对象
var data = eval("("+e.data+")"),uid='{$Think.get.uid}';
var type = data.type || '';
switch(type){
// Events.php中返回的init类型的消息,将client_id发给后台进行uid绑定
case 'init':
// 利用jquery发起ajax请求,将client_id发给后端进行uid绑定
$.post('__ROOT__/Index/bind', {uid:uid,group:1,client_id: data.client_id}, function(data){}, 'json');
break;
// 当mvc框架调用GatewayClient发消息时直接alert出来
default :
$('ul').append('<li>'+data.message+'</li>');
}
};
$(function () {
$('#send').click(function(){
var nr=$('#nr').val(),uid=$('#uid').val();
if(!nr){
alert('请输入内容');
}
if(!uid){
alert('发送对象不能为空');
}
$.post('__ROOT__/Index/message', {uid:uid,group:1,message: nr}, function(data){}, 'json');
$('#nr').val('');
//console.log(nr);
})
})
</script>
十三、修改控制文件IndexAction.class.php
<?php
use GatewayClient\Gateway;
defined('THINK_PATH') or exit();
class IndexAction extends HomeAction {
public function index(){
$this->display();
}
//绑定账号
public function bind(){
$client_id=I('client_id');
//加载GatewayClient。关于GatewayClient参见本页面底部介绍
//require_once '/your/path/GatewayClient/Gateway.php';
import('@.Plugin.GatewayClient.Gateway');
//$Gateway=new Gateway();
//$gateway = new Gateway();
// GatewayClient 3.0.0版本开始要使用命名空间
// 设置GatewayWorker服务的Register服务ip和端口,请根据实际情况改成实际值(ip不能是0.0.0.0)
Gateway::$registerAddress = '127.0.0.1:1238';
// 假设用户已经登录,用户uid和群组id在session中
$uid = I('uid');
$group_id = I('group');
// client_id与uid绑定
Gateway::bindUid($client_id, $uid);
// 加入某个群组(可调用多次加入多个群组)
Gateway::joinGroup($client_id, $group_id);
}
//接收信息
public function message(){
//加载GatewayClient。关于GatewayClient参见本页面底部介绍
//require_once '/your/path/GatewayClient/Gateway.php';
import('@.Plugin.GatewayClient.Gateway');
// GatewayClient 3.0.0版本开始要使用命名空间
// 设置GatewayWorker服务的Register服务ip和端口,请根据实际情况改成实际值(ip不能是0.0.0.0)
Gateway::$registerAddress = '127.0.0.1:1238';
$uid=I('uid');
//$message=I('message');
$message=json_encode(array(
'message'=>I('message')
));
$group=I('group');
//给所有用户发
//Gateway::sendToAll($message);
// 向任意uid的网站页面发送数据
Gateway::sendToUid($uid, $message);
// 向任意群组的网站页面发送数据
//Gateway::sendToGroup($group, $message);
}
}
十四、用谷歌浏览器访问xp.XXX.cn/Index/index?uid=1,出现如下界面即为成功,如果console报错,就根据错误自行处理
十五、然后开2个浏览器,我一个用谷歌一个用火狐,只需要改变地址栏中的uid即可,如1、2
十六、测试,用谷歌浏览器输入内容为“你好自己”,然后页面会出现“你好自己”
十七、把发送给的1改为2,然后内容写上“你好2号”,再用火狐浏览器打开,就能看到“你好2号”
好了,你的GatewayWorker已整合到tp中了。
Linux整合说明
删除除Applications外的所有文件,然后把linux版本的vendor目录和start.php放上去
执行如下代码
php start.php start
修改/www/web/yiwo/public_html/GatewayWorker/Applications/YourApp/start_gateway.php文件
//找到$gateway = new Gateway("websocket://0.0.0.0:8282");
//然后把代码替换成以下代码
//设置WSS
// 证书最好是申请的证书
$context = array(
// 更多ssl选项请参考手册 http://php.net/manual/zh/context.ssl.php
'ssl' => array(
// 请使用绝对路径
'local_cert' => '/www/wdlinux/nginx/conf/cert/yiwo.dswjcms.com.pem', // 也可以是crt文件
'local_pk' => '/www/wdlinux/nginx/conf/cert/yiwo.dswjcms.com.key',
'verify_peer' => false,
// 'allow_self_signed' => true, //如果是自签名证书需要开启此选项
)
);
// gateway 进程,这里使用Text协议,可以用telnet测试
$gateway = new Gateway("websocket://0.0.0.0:8282", $context);
// 开启SSL,websocket+SSL 即wss
$gateway->transport = 'ssl';