码字不易,转载请附原链,搬砖繁忙回复不及时见谅,技术交流请加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建立的长链接,只有在子进程重启时才会释放链接。
纸上得来终觉浅,绝知此事要躬行,看完了觉得有帮助辛苦给个赞,如果能再给个关注那再好不过了!!!