chore(WebSocket): 复用ThinkApp中的Cache及其他设置

This commit is contained in:
2026-01-17 17:52:25 +08:00
parent 5f7017b78a
commit e6929aa1f5

View File

@@ -13,9 +13,9 @@ require __DIR__ . '/vendor/autoload.php';
// 初始化ThinkPHP应用环境加载配置和环境变量主要用于数据库连接和其他配置 // 初始化ThinkPHP应用环境加载配置和环境变量主要用于数据库连接和其他配置
use think\App; use think\App;
// 创建应用实例 // 创建应用实例传入应用根目录src目录
// @intelephense-ignore-next-line // @intelephense-ignore-next-line
$app = new App(); $app = new App(__DIR__);
// 加载环境变量 // 加载环境变量
if (is_file(__DIR__ . '/.env')) { if (is_file(__DIR__ . '/.env')) {
@@ -31,6 +31,34 @@ if ($appEnv) {
} }
} }
// 初始化App实例必须否则Cache等组件无法获取配置
// 这会加载配置文件包括cache.php
if (!$app->initialized()) {
$app->initialize();
}
// 获取ThinkPHP Cache实例三种方式任选其一
// 方式1: 通过App实例直接访问推荐在CLI模式下最可靠
$cache = $app->cache;
// 方式2: 通过容器获取
// $cache = $app->make('cache');
// 方式3: 使用Facade在CLI模式下可能不可用不推荐
// use think\facade\Cache;
// Cache::get('key');
// Cache::set('key', 'value', 3600);
// Cache使用示例
// $cache->get('key'); // 获取缓存
// $cache->get('key', 'default'); // 获取缓存,不存在时返回默认值
// $cache->set('key', 'value', 3600); // 设置缓存有效期3600秒
// $cache->has('key'); // 检查缓存是否存在
// $cache->delete('key'); // 删除缓存
// $cache->clear(); // 清空所有缓存
// $cache->tag('tag_name')->set('key', 'value'); // 使用标签缓存
// $cache->tag('tag_name')->clear(); // 清除标签下的所有缓存
use Ratchet\App as RatchetApp; use Ratchet\App as RatchetApp;
use Ratchet\ConnectionInterface; use Ratchet\ConnectionInterface;
use Ratchet\MessageComponentInterface; use Ratchet\MessageComponentInterface;
@@ -51,11 +79,28 @@ use app\model\system\Addon;
$addonDir = __DIR__ . '/addon'; $addonDir = __DIR__ . '/addon';
$addonNames = []; $addonNames = [];
// 从数据库获取addon列表 // 从数据库获取addon列表使用Cache缓存避免频繁查询数据库
$cacheKey = 'websocket_addon_list';
$cacheExpire = 300; // 缓存5分钟
try { try {
$addon_model = new Addon(); // 尝试从缓存获取addon列表
$addon_data = $addon_model->getAddonList([], 'name,status'); $cachedAddons = $cache->get($cacheKey);
$current_addons = $addon_data['data'];
if ($cachedAddons !== null && !empty($cachedAddons)) {
echo "[WebSocket服务器] 从缓存获取插件列表\n";
$current_addons = $cachedAddons;
} else {
echo "[WebSocket服务器] 从数据库获取插件列表\n";
$addon_model = new Addon();
$addon_data = $addon_model->getAddonList([], 'name,status');
$current_addons = $addon_data['data'];
// 将结果存入缓存
$cache->set($cacheKey, $current_addons, $cacheExpire);
echo "[WebSocket服务器] 插件列表已缓存(有效期: {$cacheExpire}秒)\n";
}
$db_addon_names = array_column($current_addons, 'name'); $db_addon_names = array_column($current_addons, 'name');
// 2. 从addon目录读取插件列表 // 2. 从addon目录读取插件列表
@@ -218,6 +263,16 @@ class DefaultWebSocketController implements MessageComponentInterface
$ratchetApp->route('/ws', new DefaultWebSocketController(), array('*')); $ratchetApp->route('/ws', new DefaultWebSocketController(), array('*'));
echo "已注册默认WebSocket测试控制器到路径 /ws\n"; echo "已注册默认WebSocket测试控制器到路径 /ws\n";
// 缓存WebSocket服务器信息可选用于其他服务查询
$serverInfoKey = 'websocket_server_info';
$cache->set($serverInfoKey, [
'host' => $httpHost,
'port' => $port,
'address' => $address,
'started_at' => date('Y-m-d H:i:s'),
'registered_addons' => $registeredAddons
], 0); // 0表示永久缓存直到手动删除
echo "WebSocket服务器已启动监听地址: ws://{$httpHost}:{$port}\n"; echo "WebSocket服务器已启动监听地址: ws://{$httpHost}:{$port}\n";
// 显示已注册WebSocket控制器的addon路径 // 显示已注册WebSocket控制器的addon路径