使用PHPRedis和PHP-FPM时,如何关闭或重置pconnect()连接?

使用PHPRedis和PHP-FPM时,如何关闭或重置pconnect()连接?,php,linux,apache,redis,Php,Linux,Apache,Redis,使用PHPRedis和Apache PHP-FPM,我使用pconnect()调用来重用连接——在过去,它有助于避免连接数量增加太多。但是,如果我们的主redis节点发生故障,我们会自动将从节点升级为主节点,旧的主节点将变为只读节点。但是,pconnect()仍然保持与旧maste的连接,因此set()命令开始失败 我们需要的是一种在不破坏进程的情况下破坏这些持久连接的方法。有什么想法吗?你是在超时后打电话给pconnect吗?假设每次超过超时时都关闭连接,则可以在使用其他地址再次调用pconn

使用PHPRedis和Apache PHP-FPM,我使用pconnect()调用来重用连接——在过去,它有助于避免连接数量增加太多。但是,如果我们的主redis节点发生故障,我们会自动将从节点升级为主节点,旧的主节点将变为只读节点。但是,pconnect()仍然保持与旧maste的连接,因此set()命令开始失败


我们需要的是一种在不破坏进程的情况下破坏这些持久连接的方法。有什么想法吗?

你是在超时后打电话给pconnect吗?假设每次超过超时时都关闭连接,则可以在使用其他地址再次调用pconnect之前重新解析主机

如果您运行的是Redis群集,则PHPRedis具有群集模式和超时行为,该模式特定于此设置,并支持“移动”响应:
持久流是由PHP内部提供的,任何公开创建持久流的方法的东西都应该提供销毁持久流的方法,这是不成文的规则

PHP Redis违反了这一法则,您根本无法从userland销毁持久流

行动的过程应该是实施所需的方法

下面是针对实现Redis::pclose的PHP7分支的补丁:

请注意,pdisconnect的代码基于现有的disconnect,这两个函数对我来说都很奇怪,并且对它们的返回值不诚实。我假设某个地方有一些测试或代码依赖于这种奇怪现象,所以我没有尝试修复它

任何PR都应该提到,这些函数看起来很奇怪,PHP7是断开连接的最佳时机。

在phpredis 4.3.0中,close()可以关闭pconnect()创建的连接。如果在close()之后使用redis方法,将自动创建新的持久连接

/**
 * Disconnects from the Redis instance.
 *
 * Note: Closing a persistent connection requires PhpRedis >= 4.2.0
 *
 * @since >= 4.2 Closing a persistent connection requires PhpRedis
 *
 * @return bool TRUE on success, FALSE on error
 */
public function close()
{
}
phpredis>=4.2,只需关闭并重新连接即可