關於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切換主從連線失敗如何重置連線
驗證指令碼
<?php $redis = new Redis(); $redis->pconnect("127.0.0.1", 6379);echo $redis->echo("1th time").PHP_EOL; sleep(15); //$redis->pconnect("127.0.0.1", 6379); $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