最近想用Tp5.0和GatewayWorker结合做项目,总结了一下流程
- 安装ThinkPHP5.0
- 在ThinkPHP5.0根目录里composer安装GatewayWorker,
composer require workerman/gateway-worker
安装完成之后,可以在vendor目录下看到workerman, GatewayWorker就在workman目录里,因为GatewayWorker是基于workerman来开发的。
建立以下文件
define('APP_PATH', __DIR__.'/application/');
define('BIND_MODULE', 'index/Worker');
// 加载框架引导文件
require __DIR__.'/thinkphp/start.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:1236'); //初始化 bussinessWorker 进程 $worker = new BusinessWorker(); $worker->name = 'RoomBusinessWorker'; $worker->count = 4; $worker->registerAddress = '127.0.0.1:1236'; // 设置处理业务的类,此处制定Events的命名空间 $worker->eventHandler = '\app\push\controller\Events'; // 初始化 gateway 进程 $gateway = new Gateway("websocket://0.0.0.0:7272"); $gateway->name = 'RoomGateway'; $gateway->count = 4; $gateway->lanIp = '127.0.0.1'; $gateway->startPort = 2300; $gateway->registerAddress = '127.0.0.1:1236'; // 运行所有Worker; Worker::runAll(); }
}
在Linux环境直接在根目录运行 php start.php 就可以了,在windows下会报错
不允许创建多个workers,这时可以分开创建workers. 创建以下几个文件
application\push\controller\Sregister.php
namespace app\push\controller;
use Workerman\Worker;
use GatewayWorker\Register;
class Sregister
{
public function __construct(){
$register = new Register('text://0.0.0.0:1236');
Worker::runAll();
}
}
start_register.php (根目录下,用于启动Sregister.php)
define('APP_PATH', __DIR__ . '/application/');
define('BIND_MODULE','push/Sregister');
require __DIR__.'/thinkphp/start.php';
application\push\controller\Sbusinessworker.php
namespace app\push\controller;
use think\Request;
use Workerman\Worker;
use GatewayWorker\BusinessWorker;
use Workerman\Autoloader;
class Sbusinessworker
{
public function __construct()
{
// bussinessWorker 进程
$worker = new BusinessWorker();
// worker名称
$worker->name = 'ChatBusinessWorker';
// bussinessWorker进程数量
$worker->count = 4;
// 服务注册地址
$worker->registerAddress = '127.0.0.1:1236';
//设置处理业务的类,此处制定Events的命名空间
$worker->eventHandler = 'app\push\controller\Events';
Worker::runAll();
}
}
start_businessworker.php (根目录下,用于启动Sbusinessworker.php)
define('APP_PATH', __DIR__ . '/application/');
define('BIND_MODULE','push/Sbusinessworker');
require __DIR__.'/thinkphp/start.php';
application\push\controller\Gate.php
namespace app\push\controller;
use Workerman\Worker;
use GatewayWorker\Gateway;
use GatewayWorker\Register;
use GatewayWorker\BusinessWorker;
class Gate
{
public function __construct()
{
// 初始化 gateway 进程
$gateway = new Gateway("websocket://0.0.0.0:7272");
// 设置名称,方便status时查看
$gateway->name = 'ChatGateway';
$gateway->count = 4;
// 分布式部署时请设置成内网ip(非127.0.0.1)
$gateway->lanIp = '127.0.0.1';
// 内部通讯起始端口,假如$gateway->count=4,起始端口为4000
// 则一般会使用4000 4001 4002 4003 4个端口作为内部通讯端口
$gateway->startPort = 2300;
// 心跳间隔
$gateway->pingInterval = 10;
// 心跳数据
$gateway->pingData = '{"type":"ping"}';
// 服务注册地址
$gateway->registerAddress = '127.0.0.1:1236';
//运行所有Worker;
Worker::runAll();
}
}
start_gateway.php (根目录下,用于启动Gate.php)
define('APP_PATH', __DIR__ . '/application/');
define('BIND_MODULE','push/Gate');
require __DIR__.'/thinkphp/start.php';
application\push\controller\Events.php (Gatway的连接、推送、接受、断开都在这个文件处理)
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";
}
}
在根目录下写一个脚本start_for_win.bat,
php start_register.php start_gateway.php start_businessworker.php
pause
如果是在windows系统下,直接点击start_for_win.bat就可以启动GatewayWorker了
所有的业务逻辑用thinkphp来处理,而需要向客户端主动推送消息时就需要调用Gateway的API(application\push\controller\Events.php)

感谢博主,喝杯咖啡~
还没有人发表评论