【问题标题】:How to close or reset a pconnect() connection when using PHPRedis and PHP-FPM?使用 PHPRedis 和 PHP-FPM 时如何关闭或重置 pconnect() 连接?
【发布时间】:2015-12-31 05:06:19
【问题描述】:

使用 PHPRedis 和 Apache PHP-FPM 我正在​​使用 pconnect() 调用来重用连接 - 它在过去有助于不让连接数量攀升得太高。然而,在我们的主 redis 节点出现故障的情况下 - 我们会自动将从属提升为主控,而旧的主控将变为只读。但是 pconnect() 仍然保持与旧 master 的连接 - 所以 set() 命令开始失败。

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

【问题讨论】:

    标签: php linux apache redis


    【解决方案1】:
    /**
     * 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,只需关闭并重新连接。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        持久流由 PHP 内部提供,任何公开创建持久流的方法的东西也应该提供销毁它的方法,这是不成文的法律。

        PHP Redis 违反了该法律,您根本无法从用户空间销毁该持久流。

        行动方案应该是 PR 所需方法的实现。

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

        请注意,pdisconnect 的代码基于现有的断开连接,这两个函数对我来说看起来很奇怪,并且对它们的返回值不诚实。我假设在某处有一些测试或代码依赖于这种陌生性,所以没有尝试修复它。

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

        【讨论】:

          【解决方案4】:

          您是否在超时后调用 pconnect?假设每次超时都关闭连接,您可以在使用不同的地址再次调用 pconnect 之前重新解析主服务器。

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

          【讨论】:

            猜你喜欢
            • 2014-04-28
            • 2011-05-08
            • 2011-01-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多