最近在做毕业设计,两个项目都遇到了使用websocket
的需求,但不想与TP5分开。看了TP5的官方文档,有Workerman的组件,但是没得GatewayWorker的使用方法。这里总结一下!!
步骤
安装TP5
不管你是如何安装TP5的,只要最后你能打开浏览器看到TP5的欢迎界面。安装GatewayWorker
方式有很多,推荐使用composer
来安装GatewayWorker
。
如果你的composer
可以正常运行,请到你项目的根目录执行:
composer require workerman/gateway-worker
就可以安装成功了。你可以在vendor
目录下看到workerman
目录。建立入口文件
一般入口文件都是建立在public
目录的,这里的GatewayWorker
入口文件也一样。
在public
目录建立一个server.php
文件,这个文件名字随意取。
文件里内容如下:
#!/usr/bin/env php
<?php
define('APP_PATH', __DIR__ . '/../application/');
define('BIND_MODULE','push/Run');
// 加载框架引导文件
require __DIR__ . '/../thinkphp/start.php';
我相信你认真看是能懂的。
与一般的TP5入口文件一样,只是在第5行配置了一个控制器绑定:绑定到了push模块的Run控制器。
-
建立Run控制器
使用TP5自带的命令行工具可以帮助你快速生成一个控制器:php think make:controller push/Run
执行了上述指令,会在
application
目录下建立一个push/controller/Run.php
文件。我们需要在此文件下做一些处理。
<?php
namespace app\push\controller;
use Workerman\Worker;
use GatewayWorker\Register;
use GatewayWorker\BusinessWorker;
use GatewayWorker\Gateway;
class Run
{
public function __construct()
{
// 初始化register
new Register('text://0.0.0.0:1238');
//初始化 bussinessWorker 进程
$worker = new BusinessWorker();
$worker->name = 'RoomBusinessWorker';
$worker->count = 4;
$worker->registerAddress = '127.0.0.1:1238';
// 设置处理业务的类,此处制定Events的命名空间
$worker->eventHandler = '\app\push\controller\Events';
// 初始化 gateway 进程
$gateway = new Gateway("websocket://0.0.0.0:8282");
$gateway->name = 'RoomGateway';
$gateway->count = 4;
$gateway->lanIp = '127.0.0.1';
$gateway->startPort = 2900;
$gateway->registerAddress = '127.0.0.1:1238';
// 运行所有Worker;
Worker::runAll();
}
}
与一般的gateway
使用没有任何区别,如果你不懂,请看官网文档。
-
建立Events.php文件
在上述代码中66行设置了事件类,我们需要去实现它。
继续使用TP5的命令行工具去建立文件:
php think make:controller push/Events
内如如下:
<?php
namespace app\push\controller;
use GatewayWorker\Lib\Gateway;
class Events
{
/**
* 有消息时
* @param integer $client_id 连接的客户端
* @param mixed $message
* @return void
*/
public static function onMessage($client_id, $message)
{
// debug
echo "client:{$_SERVER['REMOTE_ADDR']}:{$_SERVER['REMOTE_PORT']} gateway:{$_SERVER['GATEWAY_ADDR']}:{$_SERVER['GATEWAY_PORT']} client_id:$client_id session:".json_encode($_SESSION)." onMessage:".$message."\n";
}
/**
* 当用户连接时触发的方法
* @param integer $client_id 连接的客户端
* @return void
*/
public static function onConnect($client_id)
{
Gateway::sendToClient($client_id, "Your client_id is $client_id");
}
/**
* 当用户断开连接时触发的方法
* @param integer $client_id 断开连接的客户端
* @return void
*/
public static function onClose($client_id)
{
Gateway::sendToAll("client[$client_id] logout\n");
}
/**
* 当进程启动时
* @param integer $businessWorker 进程实例
*/
public static function onWorkerStart($businessWorker)
{
echo "WorkerStart\n";
}
/**
* 当进程关闭时
* @param integer $businessWorker 进程实例
*/
public static function onWorkerStop($businessWorker)
{
echo "WorkerStop\n";
}
}
在此类型中可以使用TP5一些工具,比如模型!