最近在做畢業(yè)設(shè)計(jì)望抽,兩個(gè)項(xiàng)目都遇到了使用websocket
的需求加矛,但不想與TP5分開(kāi)∶焊荩看了TP5的官方文檔斟览,有Workerman的組件,但是沒(méi)得GatewayWorker的使用方法辑奈。這里總結(jié)一下?撩!
步驟
安裝TP5
不管你是如何安裝TP5的鸠窗,只要最后你能打開(kāi)瀏覽器看到TP5的歡迎界面妓羊。安裝GatewayWorker
方式有很多,推薦使用composer
來(lái)安裝GatewayWorker
稍计。
如果你的composer
可以正常運(yùn)行躁绸,請(qǐng)到你項(xiàng)目的根目錄執(zhí)行:
composer require workerman/gateway-worker
就可以安裝成功了。你可以在vendor
目錄下看到workerman
目錄。建立入口文件
一般入口文件都是建立在public
目錄的涨颜,這里的GatewayWorker
入口文件也一樣费韭。
在public
目錄建立一個(gè)server.php
文件,這個(gè)文件名字隨意取庭瑰。
文件里內(nèi)容如下:
#!/usr/bin/env php
<?php
define('APP_PATH', __DIR__ . '/../application/');
define('BIND_MODULE','push/Run');
// 加載框架引導(dǎo)文件
require __DIR__ . '/../thinkphp/start.php';
我相信你認(rèn)真看是能懂的星持。
與一般的TP5入口文件一樣,只是在第5行配置了一個(gè)控制器綁定:綁定到了push模塊的Run控制器弹灭。
-
建立Run控制器
使用TP5自帶的命令行工具可以幫助你快速生成一個(gè)控制器:php think make:controller push/Run
執(zhí)行了上述指令督暂,會(huì)在
application
目錄下建立一個(gè)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 進(jìn)程
$worker = new BusinessWorker();
$worker->name = 'RoomBusinessWorker';
$worker->count = 4;
$worker->registerAddress = '127.0.0.1:1238';
// 設(shè)置處理業(yè)務(wù)的類,此處制定Events的命名空間
$worker->eventHandler = '\app\push\controller\Events';
// 初始化 gateway 進(jìn)程
$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';
// 運(yùn)行所有Worker;
Worker::runAll();
}
}
與一般的gateway
使用沒(méi)有任何區(qū)別逻翁,如果你不懂,請(qǐng)看官網(wǎng)文檔捡鱼。
-
建立Events.php文件
在上述代碼中66行設(shè)置了事件類八回,我們需要去實(shí)現(xiàn)它。
繼續(xù)使用TP5的命令行工具去建立文件:
php think make:controller push/Events
內(nèi)如如下:
<?php
namespace app\push\controller;
use GatewayWorker\Lib\Gateway;
class Events
{
/**
* 有消息時(shí)
* @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";
}
/**
* 當(dāng)用戶連接時(shí)觸發(fā)的方法
* @param integer $client_id 連接的客戶端
* @return void
*/
public static function onConnect($client_id)
{
Gateway::sendToClient($client_id, "Your client_id is $client_id");
}
/**
* 當(dāng)用戶斷開(kāi)連接時(shí)觸發(fā)的方法
* @param integer $client_id 斷開(kāi)連接的客戶端
* @return void
*/
public static function onClose($client_id)
{
Gateway::sendToAll("client[$client_id] logout\n");
}
/**
* 當(dāng)進(jìn)程啟動(dòng)時(shí)
* @param integer $businessWorker 進(jìn)程實(shí)例
*/
public static function onWorkerStart($businessWorker)
{
echo "WorkerStart\n";
}
/**
* 當(dāng)進(jìn)程關(guān)閉時(shí)
* @param integer $businessWorker 進(jìn)程實(shí)例
*/
public static function onWorkerStop($businessWorker)
{
echo "WorkerStop\n";
}
}
在此類型中可以使用TP5一些工具驾诈,比如模型缠诅!