关于php-redis的pconnect长链接的思考

39 篇文章 2 订阅

码字不易,转载请附原链,搬砖繁忙回复不及时见谅,技术交流请加QQ群:909211071

抛出问题

前段时间有个大佬说,php-redis的pconnect并不能实现长链接,在请求结束后连接就被释放掉了,我心中存疑,如果是这样的话,那php-reds为什么还要有connect和pconnect?

查找文档

php-redis官方文档中有这样一句话:The connection will not be closed on end of request until the php process ends,意思就是只有在进程结束后才会被释放。所以结合fpm的运行机制,只有在当前子进程处理完配置规定的max_requests请求次数之后,随着子进程的重启,才会释放redis的连接

空说无凭,实验为证

实验依赖tideways扩展,这个扩展怎么用参考我的另一篇博客:https://blog.csdn.net/why444216978/article/details/103365063

测试代码:

<?php

function &tideways($begin = true, $file = '', $dir = '/tmp/')
{
    static $data = [];
    if ($begin){
        extension_loaded('tideways_xhprof');
        tideways_xhprof_enable(TIDEWAYS_XHPROF_FLAGS_CPU | TIDEWAYS_XHPROF_FLAGS_MEMORY);
        $data['begin'] = microtime(true);
    }else{
        $data['end'] = microtime(true);
        $dir  = sprintf('%s%s-%s.log',  $dir, $file, date('Y-m-d', time()));
        $content = json_encode(tideways_xhprof_disable());
        file_put_contents($dir, $content);
    }

    return $data;
}

tideways(true);
    $redis = new Redis();
    $con = $redis->pconnect('127.0.0.1', 6379);
    $redis->set('why', 1);
    $redis->get('why');

tideways(false, substr(basename(__FILE__), 0, -4) );
?>

首先请求2次,发现只有第一次有pconnect函数调用,第二次请求开始就没有pconnect的函数调用了:

[why@localhost /tmp]$toolkit analyze-xhprof why-2020-03-12.log 
Showing XHProf data by Exclusive Wall-Time
+-----------------+-------+-----------+------------------------------+
|    FUNCTION     | COUNT | WALL-TIME | EXCL  WALL-TIME (>= 0.75 MS) |
+-----------------+-------+-----------+------------------------------+
| Redis::pconnect |     1 | 7.54 ms   | 7.54 ms                      |
| Redis::get      |     1 | 6.32 ms   | 6.32 ms                      |
| Redis::set      |     1 | 6.21 ms   | 6.21 ms                      |
+-----------------+-------+-----------+------------------------------+
Looking for a Web UI and SQL Profiling Support? Try our SaaS: https://tideways.io
[why@localhost /tmp]$
[why@localhost /tmp]$toolkit analyze-xhprof why-2020-03-12.log 
Showing XHProf data by Exclusive Wall-Time
+------------+-------+-----------+------------------------------+
|  FUNCTION  | COUNT | WALL-TIME | EXCL  WALL-TIME (>= 1.02 MS) |
+------------+-------+-----------+------------------------------+
| Redis::set |     1 | 10.20 ms  | 10.20 ms                     |
| Redis::get |     1 | 6.67 ms   | 6.67 ms                      |
+------------+-------+-----------+------------------------------+
Looking for a Web UI and SQL Profiling Support? Try our SaaS: https://tideways.io

然后我们再重启fpm,模拟进程执行完最大请求数后重启,发现第一次请求又调用了pconnect方法:

[why@localhost /tmp]$ps -ef | grep php-fpm
    0  9715     1   0  3:39下午 ??         0:00.01 php-fpm
   -2  9716  9715   0  3:39下午 ??         0:00.01 php-fpm
   -2  9717  9715   0  3:39下午 ??         0:00.01 php-fpm
  501  9732   648   0  3:42下午 ttys001    0:00.01 grep php-fpm
[why@localhost /tmp]$sudo kill 9715
[why@localhost /tmp]$ps -ef |grep php-fpm
  501  9736   648   0  3:42下午 ttys001    0:00.00 grep php-fpm
[why@localhost /tmp]$sudo php-fpm
[why@localhost /tmp]$ps -ef | grep php-fpm
    0  9739     1   0  3:42下午 ??         0:00.00 php-fpm
   -2  9740  9739   0  3:42下午 ??         0:00.00 php-fpm
   -2  9741  9739   0  3:42下午 ??         0:00.00 php-fpm
  501  9743   648   0  3:42下午 ttys001    0:00.00 grep php-fpm
[why@localhost /tmp]$
[why@localhost /tmp]$toolkit analyze-xhprof why-2020-03-12.log 
Showing XHProf data by Exclusive Wall-Time
+-----------------+-------+-----------+------------------------------+
|    FUNCTION     | COUNT | WALL-TIME | EXCL  WALL-TIME (>= 1.03 MS) |
+-----------------+-------+-----------+------------------------------+
| Redis::pconnect |     1 | 10.33 ms  | 10.33 ms                     |
| Redis::get      |     1 | 7.89 ms   | 7.89 ms                      |
| Redis::set      |     1 | 6.87 ms   | 6.87 ms                      |
+-----------------+-------+-----------+------------------------------+
Looking for a Web UI and SQL Profiling Support? Try our SaaS: https://tideways.io
[why@localhost /tmp]$

结论

php-redis的pconnect建立的长链接,只有在子进程重启时才会释放链接。

 

纸上得来终觉浅,绝知此事要躬行,看完了觉得有帮助辛苦给个赞,如果能再给个关注那再好不过了!!!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AirGo.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值