webman2.1支持了协程和数据库连接池,不管是laravel-orm还是thinkphp-orm,都在webman/database和webman/think-orm里集成了连接池,支持在协程和非协程环境下使用,我的问题是怎么实现请求结束后,数据库连接就关闭,并且在连接池里移除当前数据库链接。因为我的场景是根据请求头不同,数据库也不一样,有很多个数据库需要连接。
请教各位社区大佬,有什么比较好的解决方案,谢谢!!!
老实说,转回FPM吧,别挣扎了,非贬义
saas目前好像就fpm比较适合点
既然不需要连接池,那你不要用就是
最简单的方法,就是 克隆一份 webman/database和 webman/think-orm;根据自己的需要重写部分逻辑。 再弄个全局中间件,实现你的切换需求。
webman/database
webman/think-orm
这个设置为1就1秒后自动关闭了
1秒内这个连接被使用的话会进入非空闲状态,用完后会进入空闲时间,空闲时间大于1时断开。
那这个业务还有必要开启协程池吗
开启协程可提高并发处理能力,和动态切换数据库,不冲突。
pool支持非协程环境,这个参数非协程环境也会生效。
设置1秒,虽然不常驻了,但是还是比fpm快
感谢walkor!
看源码不管是DatabaseManager还是DbManager类里,都有一个Context::onDestroy()方法,如果想请求之后马上彻底关闭,是不是在这时改造,直接调pool的closeConnections()即可?另外,请教Context::onDestroy()里注册的闭包,是什么执行的,协程请求结束php回收机制自动回收吗,还是下一次请求里Context::reset()的时候?
直接设置idle_timeout就行了,closeConnections是关闭idle的连接,当前正在用的连接还没归还不会关闭。
配置里面定义不同的连接,根据需要切换。 连接池是根据选择的连接创建: $key = "think-orm.connections.$name";
$key = "think-orm.connections.$name";
或者直接在代码里面配置,类似以下代码(没测试):
$config = [ 'default' => 'mysql_123', 'connections' => [ 'mysql_123' => [ // 数据库类型 'type' => 'mysql', // 服务器地址 'hostname' => '127.0.0.1', // 数据库名 'database' => 'webman', // 数据库用户名 'username' => 'webman', // 数据库密码 'password' => '123456', // 数据库连接端口 'hostport' => '3306', // 数据库连接参数 'params' => [ // 连接超时3秒 \PDO::ATTR_TIMEOUT => 3, ], // 数据库编码默认采用utf8 'charset' => 'utf8', // 数据库表前缀 'prefix' => 'wa_', // 断线重连 'break_reconnect' => true, // 连接池配置 'pool' => [ 'max_connections' => 5, // 最大连接数 'min_connections' => 1, // 最小连接数 'wait_timeout' => 3, // 从连接池获取连接等待超时时间 'idle_timeout' => 60, // 连接最大空闲时间,超过该时间会被回收 'heartbeat_interval' => 50, // 心跳检测间隔,需要小于60秒 ], ], ], // 自定义分页类 'paginator' => '', ] support\think\Db:setConfig($config); support\think\Db::connect('mysql_123'); support\think\Db::name('tes')->select();
谢谢!
老实说,转回FPM吧,别挣扎了,非贬义
saas目前好像就fpm比较适合点
既然不需要连接池,那你不要用就是
最简单的方法,就是 克隆一份
webman/database
和webman/think-orm
;根据自己的需要重写部分逻辑。再弄个全局中间件,实现你的切换需求。
这个设置为1就1秒后自动关闭了
1秒内这个连接被使用的话会进入非空闲状态,用完后会进入空闲时间,空闲时间大于1时断开。
那这个业务还有必要开启协程池吗
开启协程可提高并发处理能力,和动态切换数据库,不冲突。
pool支持非协程环境,这个参数非协程环境也会生效。
设置1秒,虽然不常驻了,但是还是比fpm快
感谢walkor!
看源码不管是DatabaseManager还是DbManager类里,都有一个Context::onDestroy()方法,如果想请求之后马上彻底关闭,是不是在这时改造,直接调pool的closeConnections()即可?另外,请教Context::onDestroy()里注册的闭包,是什么执行的,协程请求结束php回收机制自动回收吗,还是下一次请求里Context::reset()的时候?
直接设置idle_timeout就行了,closeConnections是关闭idle的连接,当前正在用的连接还没归还不会关闭。
配置里面定义不同的连接,根据需要切换。
连接池是根据选择的连接创建:
$key = "think-orm.connections.$name";
或者直接在代码里面配置,类似以下代码(没测试):
谢谢!