From 76351fbe6660df927af65552a0f9a68e8770704c Mon Sep 17 00:00:00 2001 From: whwyy Date: Wed, 24 Jun 2026 20:11:12 +0800 Subject: [PATCH] eee --- .gitignore | 1 + kiri-engine/NoSql/MongoDB.php | 44 ++++++++++++++++++++++++++++++----- kiri-engine/NoSql/Redis.php | 5 ++++ socket.html | 2 +- 4 files changed, 45 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index 050eac3c..42b2b4b1 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,4 @@ runtime/ oot d composer.lock +.gstack/ diff --git a/kiri-engine/NoSql/MongoDB.php b/kiri-engine/NoSql/MongoDB.php index 00454605..8da9a3c8 100644 --- a/kiri-engine/NoSql/MongoDB.php +++ b/kiri-engine/NoSql/MongoDB.php @@ -106,7 +106,8 @@ class MongoDB /** - * 代理方法调用到 MongoDB Client + * 代理方法调用到 MongoDB Client,内置连接健康检查和回收 + * 异常时关闭连接并回退计数器,防止断连对象污染连接池 * @param $name * @param $arguments * @return mixed @@ -124,21 +125,53 @@ class MongoDB // 如果方法存在于 Database,通过默认数据库调用 $database = $this->getDatabase(); if (method_exists($database, $name)) { - return $database->{$name}(...$arguments); + $result = $database->{$name}(...$arguments); + $this->returnClient($client); + return $result; } throw new \BadMethodCallException("Method {$name} does not exist on MongoDB Client or Database."); } catch (\Throwable $throwable) { \Kiri::getLogger()->json_log($throwable); + $this->closeClient($client); + return false; - } finally { - // MongoDB 连接是持久的,不需要释放 - $this->pool()->push($this->getName(), $client); } + $this->returnClient($client); } + /** + * 归还连接 + * @param Client $client + * @return void + */ + private function returnClient(Client $client): void + { + try { + $this->pool()->push($this->getName(), $client); + } catch (\Throwable) { + $this->closeClient($client); + } + } + + + /** + * 关闭连接并回退计数器 + * @param Client $client + * @return void + */ + private function closeClient(Client $client): void + { + try { + $client->close(); + } catch (\Throwable) { + } + $this->pool()->abandon($this->getName()); + } + + /** * 执行 MongoDB 命令 * @param array|object $command @@ -382,4 +415,3 @@ class MongoDB ], $this->options); } } - diff --git a/kiri-engine/NoSql/Redis.php b/kiri-engine/NoSql/Redis.php index bec859c3..68c872b7 100644 --- a/kiri-engine/NoSql/Redis.php +++ b/kiri-engine/NoSql/Redis.php @@ -136,6 +136,8 @@ class Redis /** + * 代理 Redis 方法调用,内置健康检查和连接回收 + * 如果连接 ping 失败则关闭连接并移除,不归还池中防止污染 * @param $name * @param $arguments * @return mixed @@ -151,6 +153,9 @@ class Redis } finally { if ($client->ping('h') == 'h') { $this->pool()->push($this->getName(), $client); + } else { + $client->close(); + $this->pool()->abandon($this->getName()); } } } diff --git a/socket.html b/socket.html index dda797ad..2a2cfa3f 100644 --- a/socket.html +++ b/socket.html @@ -67,7 +67,7 @@ } function connect() { - sock = new WebSocket('wss://center-wss.stupideyes.com/ws?access_token=a8exu0la-77ecu-ijhk-inkgt6vln-rlwwuk'); + sock = new WebSocket('ws://121.40.147.153:6611/sockets/?auth=dG9rZW49NjYxNTBhMWQwYS0wMWItMDMxYS0wZTRjNTJiNGEtMjkzMTI5JnRpbWU9MTc4MjEyODcwMCZyZWZyZXNoPTJzMTdyR1BMWDRuWElKWExycTdNU1pQNEsyUXQwQ1pId1RsWUM5dzZJTmpLU1dvOThocW5KR0tQVFNCU2E2QTllNWRMTm9DYkRBaVhVQVd1cUU3Q1B5ejZLMTVzamdaTlpJWHhXNVlKeWQ2ODBaTkhZdktHUnd5RklKT1NZTEVBMURSb3JrbTUwRVUrTmpNMjJJL0lsMmpPT3p2MzFFNFZ4WkZwb1pXSmZVV015Q1VZenFtYTg4MDRHZ0Z3anZobDlYdWFkakR3QmhmZFd4QloxSC9HWndDRHdVQjN3elFrL01wUWFOSTB2YTlqZjZzQTRESFI2VlJtYWpxYWFHdkVNV3BGOXllbGVrTXFhcUhyT0tkdUpZRXVpSzEzZkNoRUljblFqdUVzWjdGUDBYVGlkNTUybUlyQnlYQjc0YktxQVRNbklvZlFQcnl3aEVUNGRSZVhhdz09'); // sock = new WebSocket('wss://meet-bottle.zhuangb123.com/socket/?auth=dG9rZW49M2I2ODJhNzg0NS0xMTktMzBiMS1mMDkxOGRhNjktNTg2ZDEyJnRpbWU9MTc1MzA4MTI5MyZyZWZyZXNoPXBDT0VFYk9KOG8xTEVZQytyUkR4VlZIaXR1TmVWcndCY2crRTBua2U1ZkJuUWNJaHl6NUtTV0x2ZExXa1Y5aXlyK3NmRnRwOVRCVU91MnhPSVRPRjROTjhoT0hlODNNVmZjN1NXb2QyeDY0TXEvZTFEUCtySjNzNjZhVlplcXdYV0QzV2VRd0V6YkowZ29oOFFqRHVvZGcyb281OEZkZVp5TjVIcHFyejRZQ0VMbkxydXlCUmpFdjNTWnRsQ3gxMWthNDNxbEwzM1lJYVlaV2t3dEhOMm9VaXllNFpKOHFnU1FueEZ4N0c4RDhabzBhajFFeEJIZTlJUFQ0VUo3UkR0V0g2Y3A3bkY3bXlkVHB4Wnp5NG1kRlgxa3M5eC9iVlJHaVFDRnU4VEFsUVdDdHEzbmJ1TnNYZVd3Q2dXWEd1OEUzMld3THVFRzRCZFRCanA2MGtYUT09'); sock.onopen = function (data) { if (tick) {