Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 536e4c9bc5 | |||
| 91be2eba20 | |||
| d7f5f62c1c | |||
| 8b8bfa2a60 | |||
| 1ecf32bfa6 | |||
| 8c0c5b56c8 | |||
| 76351fbe66 |
@@ -34,3 +34,4 @@ runtime/
|
||||
oot
|
||||
d
|
||||
composer.lock
|
||||
.gstack/
|
||||
|
||||
+3
-8
@@ -23,7 +23,7 @@
|
||||
"ext-openssl": "*",
|
||||
"ext-swoole": "*",
|
||||
"ext-msgpack": "*",
|
||||
"symfony/console": "^v8.0",
|
||||
"symfony/console": "^v8.1.1",
|
||||
"psr/log": "1.*",
|
||||
"composer-runtime-api": "^2.0",
|
||||
"psr/http-server-middleware": "^1.0.2",
|
||||
@@ -32,17 +32,12 @@
|
||||
"nikic/php-parser": "^v5.5.0",
|
||||
"ext-inotify": "*",
|
||||
"game-worker/kiri-pool": "^v1.0",
|
||||
"psr/container": "^2.0",
|
||||
"swiftmailer/swiftmailer": "^v6.3.0"
|
||||
"psr/container": "^2.0"
|
||||
},
|
||||
"replace": {
|
||||
"symfony/polyfill-apcu": "*",
|
||||
"symfony/polyfill-php80": "*",
|
||||
"symfony/polyfill-mbstring": "*",
|
||||
"symfony/polyfill-ctype": "*",
|
||||
"symfony/polyfill-php73": "*",
|
||||
"symfony/polyfill-php72": "*",
|
||||
"symfony/polyfill-php81": "*"
|
||||
"symfony/polyfill-ctype": "*"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
|
||||
+2
-5
@@ -166,8 +166,7 @@ if (!function_exists('isJson')) {
|
||||
{
|
||||
if (is_null($string))
|
||||
return false;
|
||||
return (str_starts_with($string, '{') && str_ends_with($string, '}'))
|
||||
|| (str_ends_with($string, '[') && str_starts_with($string, ']'));
|
||||
return (str_starts_with($string, '{') && str_ends_with($string, '}')) || (str_ends_with($string, '[') && str_starts_with($string, ']'));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1029,9 +1028,7 @@ if (!function_exists('json_log')) {
|
||||
];
|
||||
$param['data'] = $data;
|
||||
|
||||
file_put_contents(storage('exception-' . date('Y-m-d') . '.log','exception'),
|
||||
json_encode($param, JSON_UNESCAPED_UNICODE),
|
||||
FILE_APPEND);
|
||||
file_put_contents(storage('exception-' . date('Y-m-d') . '.log', 'exception'), json_encode($param, JSON_UNESCAPED_UNICODE) . PHP_EOL, FILE_APPEND);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ class Coordinator
|
||||
|
||||
const string WORKER_START = 'worker:start';
|
||||
|
||||
private bool $wait = true;
|
||||
private bool $wait = false;
|
||||
|
||||
private ?Channel $channel = null;
|
||||
|
||||
@@ -22,12 +22,17 @@ class Coordinator
|
||||
public function yield(): void
|
||||
{
|
||||
if (Coroutine::getCid() > 0) {
|
||||
$this->channel = new Channel(1);
|
||||
if ($this->channel instanceof Channel) {
|
||||
$this->channel->pop();
|
||||
} else {
|
||||
while ($this->wait) {
|
||||
usleep(1000);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if ($this->wait === false) {
|
||||
return;
|
||||
}
|
||||
while ($this->wait === true) {
|
||||
usleep(1000);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,8 +42,7 @@ class Coordinator
|
||||
*/
|
||||
public function wait(): void
|
||||
{
|
||||
$this->wait = true;
|
||||
$this->channel = null;
|
||||
Coroutine::getCid() > 0 ? $this->channel = new Channel(1) : $this->wait = true;
|
||||
}
|
||||
|
||||
|
||||
@@ -47,8 +51,13 @@ class Coordinator
|
||||
*/
|
||||
public function done(): void
|
||||
{
|
||||
$this->wait = false;
|
||||
if (Coroutine::getCid() > 0) {
|
||||
$this->channel?->push(true);
|
||||
$this->channel->close();
|
||||
$this->channel = null;
|
||||
} else {
|
||||
$this->wait = false;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -106,7 +106,8 @@ class MongoDB
|
||||
|
||||
|
||||
/**
|
||||
* 代理方法调用到 MongoDB Client
|
||||
* 代理方法调用到 MongoDB Client,内置连接健康检查和回收
|
||||
* 异常时关闭连接并回退计数器,防止断连对象污染连接池
|
||||
* @param $name
|
||||
* @param $arguments
|
||||
* @return mixed
|
||||
@@ -124,18 +125,50 @@ 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());
|
||||
}
|
||||
|
||||
|
||||
@@ -382,4 +415,3 @@ class MongoDB
|
||||
], $this->options);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user