huang-yi/shadowfax

Redis连接池不能生效的问题

Closed this issue · 1 comments

按照文档配置,然后进行测试,发现大并发下,Redis::get()的时候报错了:Socket#13 has already been bound to another coroutine#1156, reading of the same socket in coroutine#1154 at the same time is not allowed.

跟踪代码后发现,连接池并没有被使用,Redis::get()还是在使用laravel自己的RedisMamager。所以出现了同时使用连接的情况。
然后发现,根本原因是,Laravel自带的RedisServiceProvider,implements了DeferrableProvider,会被滞后加载。

而且,加载时使用了app->singleton,而不是app->singletonIf,所以会直接替换shadowfax注入的RedisMamager。

我临时的解决办法,拷贝Illuminate\Redis\RedisServiceProvider的代码,新建一个自己的RedisServiceProvider,并且把app->singleton改成app->singletonIf,或者去掉implements DeferrableProvider。然后在放入config.app里面。两个方法都可以解决问题,把连接交给连接池分配,实现协程安全。

虽然问题解决了,但总感觉这样操作不太优雅。毕竟,作为一个胶水程序员,我恨不得只用composer就可以做完项目。
我是个Laravel彩笔,不知道有没有什么方法直接在shadowfax里面搞定,而不用新增一个RedisServiceProvider,以及修改config.app

延迟加载的服务的确不能直接覆盖。我思考了一下,我们可以在框架启动后手动register一下redis服务,再做覆盖即可。
非常nice的反馈👍 感谢~