最近在做畢業(yè)設(shè)計,兩個項目都遇到了使用websocket的需求,但不想與TP5分開??戳薚P5的官方文檔,有Workerman的組件,但是沒得GatewayWorker的使用方法。這里總結(jié)一下?。?/p>
步驟
安裝TP5
不管你是如何安裝TP5的,只要最后你能打開瀏覽器看到TP5的歡迎界面。安裝GatewayWorker
方式有很多,推薦使用composer來安裝GatewayWorker。
如果你的composer可以正常運行,請到你項目的根目錄執(zhí)行:
composer require workerman/gateway-worker
就可以安裝成功了。你可以在vendor目錄下看到workerman目錄。建立入口文件
一般入口文件都是建立在public目錄的,這里的GatewayWorker入口文件也一樣。
在public目錄建立一個server.php文件,這個文件名字隨意取。
文件里內(nèi)容如下:
#!/usr/bin/env php
<?php
define('APP_PATH', __DIR__ . '/../application/');
define('BIND_MODULE','push/Run');
// 加載框架引導(dǎo)文件
require __DIR__ . '/../thinkphp/start.php';
我相信你認真看是能懂的。
與一般的TP5入口文件一樣,只是在第5行配置了一個控制器綁定:綁定到了push模塊的Run控制器。
-
建立Run控制器
使用TP5自帶的命令行工具可以幫助你快速生成一個控制器:php think make:controller push/Run執(zhí)行了上述指令,會在
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';
// 設(shè)置處理業(yè)務(wù)的類,此處制定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使用沒有任何區(qū)別,如果你不懂,請看官網(wǎng)文檔。
-
建立Events.php文件
在上述代碼中66行設(shè)置了事件類,我們需要去實現(xiàn)它。
繼續(xù)使用TP5的命令行工具去建立文件:
php think make:controller push/Events
內(nèi)如如下:
<?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";
}
/**
* 當用戶連接時觸發(fā)的方法
* @param integer $client_id 連接的客戶端
* @return void
*/
public static function onConnect($client_id)
{
Gateway::sendToClient($client_id, "Your client_id is $client_id");
}
/**
* 當用戶斷開連接時觸發(fā)的方法
* @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";
}
/**
* 當進程關(guān)閉時
* @param integer $businessWorker 進程實例
*/
public static function onWorkerStop($businessWorker)
{
echo "WorkerStop\n";
}
}
在此類型中可以使用TP5一些工具,比如模型!