This commit is contained in:
2021-01-05 10:23:20 +08:00
parent 9ad16e7d70
commit 8a562264bb
3 changed files with 33 additions and 19 deletions
+9 -5
View File
@@ -7,6 +7,8 @@ namespace Snowflake\Abstracts;
use Exception; use Exception;
use HttpServer\Http\Context; use HttpServer\Http\Context;
use PDO;
use Redis;
use Swoole\Coroutine; use Swoole\Coroutine;
use Swoole\Coroutine\Channel; use Swoole\Coroutine\Channel;
@@ -105,22 +107,24 @@ abstract class Pool extends Component
* @param array $config * @param array $config
* @param string $coroutineName * @param string $coroutineName
* @param callable $createHandler * @param callable $createHandler
* @return PDO|Redis|null
* @throws Exception
*/ */
public function createConnect(array $config, string $coroutineName, callable $createHandler): void public function createConnect(array $config, string $coroutineName, callable $createHandler): PDO|Redis|null
{ {
if ($this->size($coroutineName) > 0) { if ($this->size($coroutineName) > 0) {
return; return $this->get($coroutineName)[1];
} }
if (Context::hasContext('create:connect:' . $coroutineName)) { if (Context::hasContext('create:connect:' . $coroutineName)) {
return; return $this->get($coroutineName)[1];
} }
Context::setContext('create:connect:' . $coroutineName, 1); Context::setContext('create:connect:' . $coroutineName, 1);
$client = call_user_func($createHandler, ...$config); $client = call_user_func($createHandler, ...$config);
$this->push($coroutineName, $client);
Context::deleteId('create:connect:' . $coroutineName); Context::deleteId('create:connect:' . $coroutineName);
return $client;
} }
+10 -7
View File
@@ -207,11 +207,12 @@ class Connection extends Pool
return Context::getContext($coroutineName); return Context::getContext($coroutineName);
} }
if ($this->size($coroutineName) < 1) { if ($this->size($coroutineName) < 1) {
$this->newClient($config, $coroutineName); $connections = $this->newClient($config, $coroutineName);
} } else {
[$time, $connections] = $this->get($coroutineName); [$time, $connections] = $this->get($coroutineName);
if (!($connections instanceof PDO)) { if (!($connections instanceof PDO)) {
throw new Exception('Database exception.'); throw new Exception('Database exception.');
}
} }
return Context::setContext($coroutineName, $connections); return Context::setContext($coroutineName, $connections);
} }
@@ -220,10 +221,12 @@ class Connection extends Pool
/** /**
* @param $config * @param $config
* @param $coroutineName * @param $coroutineName
* @return PDO|null
* @throws Exception
*/ */
private function newClient($config, $coroutineName) private function newClient($config, $coroutineName): PDO|null
{ {
$this->createConnect($this->parseConfig($config, $coroutineName), $coroutineName, function ($cds, $username, $password, $charset, $coroutineName) { return $this->createConnect($this->parseConfig($config, $coroutineName), $coroutineName, function ($cds, $username, $password, $charset, $coroutineName) {
$link = new PDO($cds, $username, $password, [ $link = new PDO($cds, $username, $password, [
PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_EMULATE_PREPARES => false,
PDO::ATTR_CASE => PDO::CASE_NATURAL, PDO::ATTR_CASE => PDO::CASE_NATURAL,
+14 -7
View File
@@ -58,19 +58,26 @@ class Redis extends Pool
public function getByChannel($coroutineName, $config): mixed public function getByChannel($coroutineName, $config): mixed
{ {
if (!$this->hasItem($coroutineName)) { if (!$this->hasItem($coroutineName)) {
$this->newClient($config, $coroutineName); $clients = $this->newClient($config, $coroutineName);
} } else {
[$time, $clients] = $this->get($coroutineName); [$time, $clients] = $this->get($coroutineName);
if ($clients === null) { if ($clients === null) {
return $this->getByChannel($coroutineName, $config); return $this->getByChannel($coroutineName, $config);
}
} }
return $this->saveClient($coroutineName, $clients); return $this->saveClient($coroutineName, $clients);
} }
private function newClient($config, $coroutineName) /**
* @param $config
* @param $coroutineName
* @return SRedis|null
* @throws Exception
*/
private function newClient($config, $coroutineName): \Redis|null
{ {
$this->createConnect([$config, $coroutineName], $coroutineName, function ($config, $coroutineName) { return $this->createConnect([$config, $coroutineName], $coroutineName, function ($config, $coroutineName) {
$redis = new SRedis(); $redis = new SRedis();
if (!$redis->connect($config['host'], (int)$config['port'], $config['timeout'])) { if (!$redis->connect($config['host'], (int)$config['port'], $config['timeout'])) {
throw new RedisConnectException(sprintf('The Redis Connect %s::%d Fail.', $config['host'], $config['port'])); throw new RedisConnectException(sprintf('The Redis Connect %s::%d Fail.', $config['host'], $config['port']));