lanlin/notes

PHP Redis 长连接多数据库切换不正常 or PHP Redis pconnect() always save data to last database

Opened this issue · 0 comments

问题场景

启用 Redis 长连接,并设置了多个数据库(index)。
在相同 PHP 进程中切换不同数据库时,数据始终被保存到了最后那个数据库(index)中。

Redis 长连接 pconnect 原理

Redis 长连接 pconnect 的生命周期是 FPM 进程的生命周期,而非一次 PHP CGI 的执行周期.
在 FPM 的整个生命周期里,长连接会反复被重用,直到 FPM 进程结束。

当使用了 pconnect 后,调用 close 仅仅使当前 PHP 不能再进行 Redis 请求.
但无法真正关闭 Redis 长连接,连接在后续请求中仍然会被重用,直至 FPM 进程生命周期结束。

原因分析

没有正确的设置 persistent id 导致的。

通过上述的原理,我们知道长连接建立之后就在那里固定着了。
也就是说,它之前被创建时连的是哪个数据库,后面也一直都是连的那个数据库。

所以,由于没有正确的设置,或者没有设置 persistent id。
导致在重用连接的时候,并没有选择一个对应的长连接来使用。
本来该用 “0” 的,结果重用了一个 “1” 库的连接,当然数据会写入到 “1” 中去了。

建议方法

$index = 'your database index number, exp: 0, 1...';

$redis->pconnect($host, $port, $timeout, "persistentid_{$index}");