连接池

由于 Swoole 的常驻内存特性,所以 IMI 中实现了连接池。所有的数据库、Redis连接,都通过连接池去获取。

定义连接池

连接池的配置,可以写在项目配置文件中,也可以写在服务器配置文件中。

在配置文件中有一个pools节点,里面配置的是连接池。

同步池子仅在task进程使用,异步池子在worker进程使用。一般使用时无需自行判断在哪个进程,框架会自动帮你获取对应的连接。

MySQL 连接池

  1. <?php
  2. return [
  3. 'pools' => [
  4. // 连接池名称
  5. 'alias1' => [
  6. // 同步池子,task进程使用
  7. 'sync' => [
  8. 'pool' => [
  9. 'class' => \Imi\Db\Pool\SyncDbPool::class,
  10. 'config' => [
  11. // 池子中最多资源数
  12. // 'maxResources' => 10,
  13. // 池子中最少资源数
  14. // 'minResources' => 2,
  15. // 资源回收时间间隔,单位:秒
  16. // 'gcInterval' => 60,
  17. // 获取资源最大存活时间,单位:秒
  18. // 'maxActiveTime' => 3600,
  19. // 等待资源最大超时时间,单位:毫秒
  20. // 'waitTimeout' => 3000,
  21. ],
  22. ],
  23. 'resource' => [
  24. 'dbClass' => \Imi\Db\Drivers\PdoMysql\Driver::class,
  25. 'host' => '127.0.0.1',
  26. 'username' => 'root',
  27. 'password' => 'root',
  28. 'database' => 'database',
  29. // 'port' => '3306',
  30. // 'timeout' => '建立连接超时时间',
  31. // 'charset' => '',
  32. // 'strict_type' => false, //开启严格模式,返回的字段将自动转为数字类型
  33. ],
  34. ],
  35. // 异步池子,worker进程使用
  36. 'async' => [
  37. 'pool' => [
  38. 'class' => \Imi\Db\Pool\CoroutineDbPool::class,
  39. 'config' => [
  40. // 同上
  41. ],
  42. ],
  43. 'resource' => [
  44. 'dbClass' => \Imi\Db\Drivers\CoroutineMysql\Driver::class,
  45. 'host' => '127.0.0.1',
  46. 'username' => 'root',
  47. 'password' => 'root',
  48. 'database' => 'database',
  49. // 'timeout' => '建立连接超时时间',
  50. // 'charset' => '',
  51. // 'options' => [], // PDO连接选项
  52. ],
  53. ],
  54. ]
  55. ],
  56. ];

Redis 连接池

  1. <?php
  2. return [
  3. 'pools' => [
  4. // 连接池名称
  5. 'alias1' => [
  6. // 同步池子,task进程使用
  7. 'sync' => [
  8. 'pool' => [
  9. 'class' => \Imi\Redis\SyncRedisPool::class,
  10. 'config' => [
  11. // 同上
  12. ],
  13. ],
  14. 'resource' => [
  15. // 'host' => '127.0.0.1',
  16. // 'port' => 6379,
  17. // 是否自动序列化变量
  18. // 'serialize' => true,
  19. // 密码
  20. // 'password' => null,
  21. // 第几个库
  22. // 'db' => 0,
  23. ],
  24. ],
  25. // 异步池子,worker进程使用
  26. 'async' => [
  27. 'pool' => [
  28. 'class' => \Imi\Redis\CoroutineRedisPool::class,
  29. 'config' => [
  30. // 同上
  31. ],
  32. ],
  33. 'resource' => [
  34. // 同上
  35. ],
  36. ],
  37. ]
  38. ],
  39. ];

获取连接

获取池子中的资源

\Imi\Pool\PoolManager::getResource(string $name): IPoolResource

$name 为池子名称

获取请求上下文资源

一个请求上下文通过此方法,只能获取同一个资源

\Imi\Pool\PoolManager::getRequestContextResource(string $name): IPoolResource

尝试获取资源

\Imi\Pool\PoolManager::tryGetResource(string $name): IPoolResource|boolean

回调方式使用资源

使用回调来使用池子中的资源,无需手动释放

  1. $result = \Imi\Pool\PoolManager::use($poolName, function($resource, \Swoole\Coroutine\Redis $redis) use($key){
  2. return $redis->get($key);
  3. });

$poolName-池子名称
第二个参数为回调,接收两个参数,第一个资源本身,第二个为资源里面的实例。比如上面的是Redis
回调的返回值也会成为use方法的返回值

手动释放连接

\Imi\Pool\PoolManager::releaseResource(IPoolResource $resource)

自动释放连接

调用\Imi\Pool\PoolManager::getRequestContextResource()方法获取,当上下文被销毁时,会自动释放资源。