关于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

 
 
 
 
原文地址:https://www.cnblogs.com/xuhuaiqu/p/14208417.html