tapi/app/event/AdminGatewayEvents.php
2025-08-29 18:00:17 +08:00

123 lines
5.6 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace app\event;
/**
* 用于检测业务代码死循环或者长时间阻塞等问题
* 如果发现业务卡死可以将下面declare打开去掉//注释并执行php start.php reload
* 然后观察一段时间workerman.log看是否有process_timeout异常
*/
//declare(ticks=1);
/**
* 聊天主逻辑
* 主要是处理 onMessage onClose
*/
use \GatewayWorker\Lib\Gateway;
class AdminGatewayEvents
{
public static function onMessage(int $client_id, string $message):void
{
var_dump($message);
// 客户端传递的是json数据
$message_data = json_decode($message, true);
if (!$message_data) {
return;
}
$message_data = array_merge([
'type' => '',
'event'=> '',
], $message_data);
// 根据类型执行不同的业务
switch ($message_data['type']) {
// 客户端回应服务端的心跳
case 'pong':
return;
case 'system':
switch ($message_data['event']) {
// 客户端登录 message格式: {type:login, name:xx, room_id:1} 添加到客户端广播给所有客户端xx进入聊天室
case 'login':
// 判断是否有房间号
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;
}
return;
}
}
public static function onClose(int $client_id)
{
var_dump(['client_id' => $client_id, 'r'=>'CLOSET']);
// // 从房间的客户端列表中删除
// if (isset($_SESSION['room_id'])) {
// $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));
// }
}
}