zoukankan      html  css  js  c++  java
  • 关于php pconnect长连接如何刷新连接的讨论

    由于每个pconnect所建立的连接信息和单个进程绑定。线上偶发了redis在某一台机器php-fpm上连接正常而无法进行任何操作的问题。

    先说结论

    查看redis拓展官方文档 close方法 有一句提示

    Closing a persistent connection requires PhpRedis >= 4.2.0

    证明最新版本close方法已经可以正常的关闭连接了 即直接使用close 再重新连接即可。而老版本则没有方法对单个进程的连接信息进行关闭或者更新。

    目前网上关于pconnect长连接的关闭有如下描述


    如果代码中使用pconnect, close的作用仅是使当前php不能再进行redis请求,但无法真正关闭redis长连接,连接在后续请求中仍然会被重用,直至fpm进程生命周期结束。

    此结论来源于文章 https://www.cnblogs.com/huanxiyun/articles/6554670.html 

    而最新版predis经过验证
    版本 php 7.0.33
    php拓展 redis版本 php —ri redis查看为 5.3.2

    结论和文章所述不同 在此更新下较老的结论

    本地验证的结果 close会关闭当前的连接。如果在close后调用新的redis命令,则pconnect会重新连接到redis。

    如果unset掉redis连接对象。则无法再找到当前连接到信息。意味着我们无法使用当前对象的信息继续发送任何命令。但是我自己的验证是无法关闭连接的。

    而在4.2.0版本前 则:

    close不会关闭连接。也仍然可以发送redis命令。

    我没有找到unset可以关闭单个进程的pconnect连接的方法。

    Stack overflow 上有关于此类情景的讨论,意思就是使用pconnect如果redis切换主从连接失败如何重置连接

    https://stackoverflow.com/questions/32916465/how-to-close-or-reset-a-pconnect-connection-when-using-phpredis-and-php-fpm

    验证脚本

    <?php
    
    $redis = new Redis();
    $redis->pconnect("127.0.0.1", 6379);
    
    echo $redis->echo("1th time").PHP_EOL;
    sleep(15);
    
    $redis->close();
    //unset($redis);
    echo $redis->echo("2th time").PHP_EOL;

    sleep(15);

    查看连接信息

    redis下  client list

    linux下 ps -ef | grep php | grep -v grep | awk '{print $2}' | xargs lsof -n -p | grep 6379

     
     
     
     
  • 相关阅读:
    javaSE第十五天
    javaSE第十四天
    javaSE第十三天
    javaSE第十二天
    javaSE第十一天
    javaSE第十天
    javaSE第九天
    python011 Python3 字典
    python010 Python3 元组
    python009 Python3 列表
  • 原文地址:https://www.cnblogs.com/xuhuaiqu/p/14208417.html
Copyright © 2011-2022 走看看