1. 程式人生 > 實用技巧 >關於php pconnect長連線如何重新整理連線的網上錯誤資訊更正

關於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->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