如何在使用PHPRedis和PHP-FPM时closures或重置pconnect()连接?

使用PHPRedisApache PHP-FPM我使用pconnect()调用来重新使用连接 – 它在过去很有帮助,不会让连接数量过高。 但是,在我们的主要redis节点出现故障的情况下 – 我们自动将从服务器提升为主服务器,旧主服务器变为只读服务器。 然而,pconnect()仍然保持与旧的maste的连接 – 所以set()命令开始失败。

我们需要的是一种能够在不中断程序的情况下拆除这些永久连接的方法。 有任何想法吗?

持久化流由PHP内部提供,任何公开创建持久化流的方法都应该提供一种方法来销毁它,这是不成文的规律。

PHP Redis打破了这个法则,你根本没有办法破坏来自userland的持续流。

行动的过程应该是公关执行所要求的方法。

这是一个针对实现Redis :: pclose的PHP7分支的补丁: https ://gist.github.com/krakjoe/326eadc61bea38fdd6e6

请注意,pdisconnect的代码是基于现有的断开连接,这两个函数对我来说看起来很奇怪,对于它们的返回值并不诚实。 我假设有一些测试或代码依赖于这种奇怪的地方,所以没有试图解决它。

任何PR都应该提到这些功能看起来很奇怪,PHP7是打破东西的最佳时机。

你用超时时间调用pconnect吗? 假设每超过一次超时就关闭连接,可以在用另外一个地址再次调用pconnect之前重新解析master。

如果您正在运行Redis集群,则PHPRedis具有超时行为的集群模式,该模式特定于此设置,支持“MOVED”响应: https : //github.com/phpredis/phpredis/blob/develop/cluster.markdown#timeout