up. 添加gateway event类

This commit is contained in:
u2nyakim 2025-08-29 18:00:17 +08:00
parent 87dc171497
commit 0247c8d713

View File

@ -1,19 +1,6 @@
<?php <?php
namespace app\event; namespace app\event;
/**
* This file is part of workerman.
*
* Licensed under The MIT License
* For full copyright and license information, please see the MIT-LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @author walkor<walkor@workerman.net>
* @copyright walkor<walkor@workerman.net>
* @link http://www.workerman.net/
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
/** /**
* 用于检测业务代码死循环或者长时间阻塞等问题 * 用于检测业务代码死循环或者长时间阻塞等问题
* 如果发现业务卡死可以将下面declare打开去掉//注释并执行php start.php reload * 如果发现业务卡死可以将下面declare打开去掉//注释并执行php start.php reload
@ -25,120 +12,111 @@ namespace app\event;
* 聊天主逻辑 * 聊天主逻辑
* 主要是处理 onMessage onClose * 主要是处理 onMessage onClose
*/ */
use \GatewayWorker\Lib\Gateway; use \GatewayWorker\Lib\Gateway;
class AdminGatewayEvents class AdminGatewayEvents
{ {
public static function onMessage(int $client_id, string $message):void
/**
* 有消息时
* @param int $client_id
* @param mixed $message
*/
public static function onMessage($client_id, $message)
{ {
// debug var_dump($message);
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";
// 客户端传递的是json数据 // 客户端传递的是json数据
$message_data = json_decode($message, true); $message_data = json_decode($message, true);
if(!$message_data) if (!$message_data) {
{ return;
return ;
} }
$message_data = array_merge([
'type' => '',
'event'=> '',
], $message_data);
// 根据类型执行不同的业务 // 根据类型执行不同的业务
switch($message_data['type']) switch ($message_data['type']) {
{
// 客户端回应服务端的心跳 // 客户端回应服务端的心跳
case 'pong': case 'pong':
return; return;
// 客户端登录 message格式: {type:login, name:xx, room_id:1} 添加到客户端广播给所有客户端xx进入聊天室 case 'system':
case 'login': switch ($message_data['event']) {
// 判断是否有房间号 // 客户端登录 message格式: {type:login, name:xx, room_id:1} 添加到客户端广播给所有客户端xx进入聊天室
if(!isset($message_data['room_id'])) case 'login':
{ // 判断是否有房间号
throw new \Exception("\$message_data['room_id'] not set. client_ip:{$_SERVER['REMOTE_ADDR']} \$message:$message"); if (!isset($message_data['room_id'])) {
throw new \Exception("\$message_data['room_id'] not set. client_ip:{$_SERVER['REMOTE_ADDR']} \$message:$message");
}
// 把房间号昵称放到session中
$room_id = $message_data['room_id'];
$client_name = htmlspecialchars($message_data['client_name']);
$_SESSION['room_id'] = $room_id;
$_SESSION['client_name'] = $client_name;
// 获取房间内所有用户列表
$clients_list = Gateway::getClientSessionsByGroup($room_id);
foreach ($clients_list as $tmp_client_id => $item) {
$clients_list[$tmp_client_id] = $item['client_name'];
}
$clients_list[$client_id] = $client_name;
// 转播给当前房间的所有客户端xx进入聊天室 message {type:login, client_id:xx, name:xx}
$new_message = array('type' => $message_data['type'], 'client_id' => $client_id, 'client_name' => htmlspecialchars($client_name), 'time' => date('Y-m-d H:i:s'));
Gateway::sendToGroup($room_id, json_encode($new_message));
Gateway::joinGroup($client_id, $room_id);
// 给当前用户发送用户列表
$new_message['client_list'] = $clients_list;
Gateway::sendToCurrentClient(json_encode($new_message));
return;
// 客户端发言 message: {type:say, to_client_id:xx, content:xx}
case 'say':
// 非法请求
if (!isset($_SESSION['room_id'])) {
throw new \Exception("\$_SESSION['room_id'] not set. client_ip:{$_SERVER['REMOTE_ADDR']}");
}
$room_id = $_SESSION['room_id'];
$client_name = $_SESSION['client_name'];
// 私聊
if ($message_data['to_client_id'] != 'all') {
$new_message = array(
'type' => 'say',
'from_client_id' => $client_id,
'from_client_name' => $client_name,
'to_client_id' => $message_data['to_client_id'],
'content' => "<b>对你说: </b>" . nl2br(htmlspecialchars($message_data['content'])),
'time' => date('Y-m-d H:i:s'),
);
Gateway::sendToClient($message_data['to_client_id'], json_encode($new_message));
$new_message['content'] = "<b>你对" . htmlspecialchars($message_data['to_client_name']) . "说: </b>" . nl2br(htmlspecialchars($message_data['content']));
Gateway::sendToCurrentClient(json_encode($new_message));
return;
}
$new_message = array(
'type' => 'say',
'from_client_id' => $client_id,
'from_client_name' => $client_name,
'to_client_id' => 'all',
'content' => nl2br(htmlspecialchars($message_data['content'])),
'time' => date('Y-m-d H:i:s'),
);
Gateway::sendToGroup($room_id, json_encode($new_message));
return;
} }
// 把房间号昵称放到session中
$room_id = $message_data['room_id'];
$client_name = htmlspecialchars($message_data['client_name']);
$_SESSION['room_id'] = $room_id;
$_SESSION['client_name'] = $client_name;
// 获取房间内所有用户列表
$clients_list = Gateway::getClientSessionsByGroup($room_id);
foreach($clients_list as $tmp_client_id=>$item)
{
$clients_list[$tmp_client_id] = $item['client_name'];
}
$clients_list[$client_id] = $client_name;
// 转播给当前房间的所有客户端xx进入聊天室 message {type:login, client_id:xx, name:xx}
$new_message = array('type'=>$message_data['type'], 'client_id'=>$client_id, 'client_name'=>htmlspecialchars($client_name), 'time'=>date('Y-m-d H:i:s'));
Gateway::sendToGroup($room_id, json_encode($new_message));
Gateway::joinGroup($client_id, $room_id);
// 给当前用户发送用户列表
$new_message['client_list'] = $clients_list;
Gateway::sendToCurrentClient(json_encode($new_message));
return; return;
// 客户端发言 message: {type:say, to_client_id:xx, content:xx}
case 'say':
// 非法请求
if(!isset($_SESSION['room_id']))
{
throw new \Exception("\$_SESSION['room_id'] not set. client_ip:{$_SERVER['REMOTE_ADDR']}");
}
$room_id = $_SESSION['room_id'];
$client_name = $_SESSION['client_name'];
// 私聊
if($message_data['to_client_id'] != 'all')
{
$new_message = array(
'type'=>'say',
'from_client_id'=>$client_id,
'from_client_name' =>$client_name,
'to_client_id'=>$message_data['to_client_id'],
'content'=>"<b>对你说: </b>".nl2br(htmlspecialchars($message_data['content'])),
'time'=>date('Y-m-d H:i:s'),
);
Gateway::sendToClient($message_data['to_client_id'], json_encode($new_message));
$new_message['content'] = "<b>你对".htmlspecialchars($message_data['to_client_name'])."说: </b>".nl2br(htmlspecialchars($message_data['content']));
return Gateway::sendToCurrentClient(json_encode($new_message));
}
$new_message = array(
'type'=>'say',
'from_client_id'=>$client_id,
'from_client_name' =>$client_name,
'to_client_id'=>'all',
'content'=>nl2br(htmlspecialchars($message_data['content'])),
'time'=>date('Y-m-d H:i:s'),
);
return Gateway::sendToGroup($room_id ,json_encode($new_message));
} }
} }
/** public static function onClose(int $client_id)
* 当客户端断开连接时
* @param integer $client_id 客户端id
*/
public static function onClose($client_id)
{ {
// debug var_dump(['client_id' => $client_id, 'r'=>'CLOSET']);
echo "client:{$_SERVER['REMOTE_ADDR']}:{$_SERVER['REMOTE_PORT']} gateway:{$_SERVER['GATEWAY_ADDR']}:{$_SERVER['GATEWAY_PORT']} client_id:$client_id onClose:''\n"; // // 从房间的客户端列表中删除
// if (isset($_SESSION['room_id'])) {
// 从房间的客户端列表中删除 // $room_id = $_SESSION['room_id'];
if(isset($_SESSION['room_id'])) // $new_message = array('type' => 'logout', 'from_client_id' => $client_id, 'from_client_name' => $_SESSION['client_name'], 'time' => date('Y-m-d H:i:s'));
{ // Gateway::sendToGroup($room_id, json_encode($new_message));
$room_id = $_SESSION['room_id']; // }
$new_message = array('type'=>'logout', 'from_client_id'=>$client_id, 'from_client_name'=>$_SESSION['client_name'], 'time'=>date('Y-m-d H:i:s'));
Gateway::sendToGroup($room_id, json_encode($new_message));
}
} }
} }