larveral开发api源码 php_thinkphp3.2使用GatewayWorker编写websocket服务器

本文介绍了如何在larveral开发环境中,结合php的thinkphp3.2.3框架,整合GatewayWorker来搭建WebSocket服务器。详细步骤包括下载GatewayWorker和thinkphp3.2.3,然后进行相关文件的复制和修改,最后展示相关控制器和事件处理类的代码片段。
摘要由CSDN通过智能技术生成

一、下载

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);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值