一、下载
1、GatewayWorker
百度网盘
官方
2、thinkphp3.2.3
二、GatewayWorker thinkphp3.2 整合
1、复制GatewayWorker\vendor\workerman\gateway-worker\src到ThinkPHP\Library文件夹下,更名为GatewayWorker。除了DbConnection.php之外的所有文件全部改成.class.php结尾。
2、复制GatewayWorker\vendor\workerman\workerman到ThinkPHP\Library文件夹下,更名为Workerman。除了Constants.php之外的所有文件全部改成.class.php结尾。
2.1、将Worker.class.php文件的831行-836行改为
if (!isset($argv[2]) || !in_array($argv[2],
$available_commands)) {exit($usage);
}
2.2、将Worker.class.php文件的831行-836行改为839行-840行改为
$command = trim($argv[2]);$command2 = isset($argv[3]) ? $argv[3] : '';
三、源码
Application\Home\Controller\IndexController.class.php
namespace Home\Controller;useThink\Controller;class IndexController extendsController {public functionindex(){$this->display();
}
}
Application\Home\Controller\SocketController.class.php
namespace Home\Controller;useWorkerman\Worker;useWorkerman\Autoloader;useGatewayWorker\Gateway;useGatewayWorker\BusinessWorker;useGatewayWorker\Register;use Home\Controller\EventsController asEvents;classSocketController{public function__construct(){
}public functionstart(){$this->startRegister();$this->startBusinessWorker();$this->startGateWay();
Worker::runAll();
}private functionstartRegister(){//new Register('text://192.168.10.149:1237');//本地
new Register('text://0.0.0.0:1238');//正式
}private functionstartBusinessWorker(){$worker = newBusinessWorker();$worker->name = 'BusinessWorker';//worker名称
$worker->count = 1;//bussinessWorker进程数量
// $worker->registerAddress = '192.168.10.149:1237';// 本地服务注册地址
$worker->registerAddress = '127.0.0.1:1238';//正式服务注册地址
$worker->eventHandler = Events::class;//设置处理业务的类,此处制定Events的命名空间
}private functionstartGateWay(){//$gateway = new Gateway("Websocket://0.0.0.0:7272");// 本地 gateway 进程
$gateway = new Gateway("websocket://192.168.161.130:8282");//正式 gateway 进程
$gateway->name = 'Gateway';//设置名称,方便status时查看
$gateway->count = 4;//设置进程数,gateway进程数建议与cpu核数相同
// $gateway->lanIp = '127.0.0.1';// 本地分布式部署时请设置成内网ip(非192.168.10.149)
$gateway->lanIp = '127.0.0.1';//正式分布式部署时请设置成内网ip(非192.168.10.149)
$gateway->startPort = 2900;//内部通讯起始端口,假如$gateway->count=4,起始端口为4000
$gateway->pingInterval = 10;//心跳间隔
$gateway->pingData = '{"type":"ping"}';//心跳数据
// $gateway->registerAddress = '192.168.10.149:1237';// 本地服务注册地址
$gateway->registerAddress = '127.0.0.1:1238';//正式服务注册地址
}
}
Application\Home\Controller\EventsController.class.php
namespace Home\Controller;useThink\Controller;/**
* 用于检测业务代码死循环或者长时间阻塞等问题
* 如果发现业务卡死,可以将下面declare打开(去掉//注释),并执行php start.php reload
* 然后观察一段时间workerman.log看是否有process_timeout异常*/
//declare(ticks=1);
/**
* 聊天主逻辑
* 主要是处理 onMessage onClose*/
useGatewayWorker\Lib\Gateway;//use GatewayWorker\Lib\DbConnection;
classEventsController
{/**
* 有消息时
* @param int $client_id
* @param mixed $message*/
public static function onMessage($client_id, $message)
{
Gateway::sendToClient($client_id, $message);
}
}
Application/Home/View/Index/index.html
WebSocket示例varwebSocket= null;
initSocket();functioninitSocket() {if(!"WebSocket" inwindow) {
console.log("您的浏览器不支持 WebSocket!");return;
}else{
console.log("连接成功");
}
webSocket= newWebSocket("ws://"+document.domain+":8282");
webSocket.onopen=handleSend;
webSocket.onmessage=handleMessage;
webSocket.onclose=handleClose;
webSocket.οnerrοr=handleError;
}//向服务器端发送数据
functionhandleSend() {//Web Socket 已连接上,使用 send() 方法发送数据
testing();
}//处理服务器端发送过来的数据
functionhandleMessage(evt) {varreceived_msg=evt.data;
console.log("收到消息"+received_msg);
}//处理连接关闭事件
functionhandleClose() {
console.log("连接已关闭...");
}//处理WebSocket错误
functionhandleError() {
console.log("WebSocketError!");
}functiontesting() {//每隔3秒钟向服务器发送数据,此处仅用于测试
varitems=['张三','李四','小二黑','阿杜','单工','大理寺','花荣','刘备','诸葛亮'];
setInterval(function() {varitem=items[Math.floor(Math.random()*items.length)];
console.log("发送消息"+item);
webSocket.send(item);
},3000);
}