国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > PHP > 正文

PHP- 深入PHP、Redis連接

2019-11-08 03:12:03
字體:
來源:轉載
供稿:網友

php- 深入PHP、Redis連接

pconnect, phPRedis中用于client連接server的api。

The connection will not be closed on close or end of request until the php process ends. 這是api說明中的一句原文

那么問題來了: 1. php process ends是指一次php執行完結,還是fpm的終結?如果是后者,那意味著即使一次php執行完畢,redis連接也不會被釋放,下一次執行時redis連接會被重用。 2. The connection will not be closed on close是 說如果使用了pconnect, 即使在代碼中顯示的調用close(), 也不會關閉連接?

帶著這兩個問題,我們做下實驗,深入看一下pconnect究竟做了些什么。

準備工作

環境: nginx + php-fpm php5.3 我們將fpm配置為

pm.max_children = 1 pm.start_servers = 1 pm.max_spare_servers = 1

這樣,我們的頁面請求會由一個確定的fpm進程執行,方便strace跟蹤。

對應頁面請求的php代碼: 復制代碼

ip=“10.136.30.144”;port = 7777; $redis = new Redis();

redis?>pconnect(ip, port,1);key = “test”; $value = “this is test”;

redis?>set(key, value);d = redis?>get(key); var_dump($d);

復制代碼

代碼的功能很簡單,連接redis,先設置一個值,再取出。

測試問題1

思路:   使用strace觀察fpm的系統調用,如果連接的生命周期是一次php執行,那么每次頁面調用,都會有connect系統調用,用以連接redis;如果連接的生命周期是fpm的終結,那么只有第一次頁面調用會有connect系統調用 ,之后由于連接被重用,無需connect,直接發命令請求即可。

啟動一個新的fpm(進程號28082)。 執行

strace -p 28082 -s 1024 -o redis_1

記錄一次頁面請求的系統調用。如下圖所示:

可以看到進程先建立了socket連接(文件描述符為9)。然后給reids發一系列命令,最終取到“this is test”的結果串。且沒有關閉連接相關的redis命令或系統調用。

頁面請求結束后,我lsof -n -p 28082到,fpm進程仍然保有一個到10.136.30.144的reids連接,其文件描述符為9(這與strace的結果一致)。

執行

strace -p 28082 -s 1024 -o redis_2

記錄 第二次頁面請求的系統調用,得到下面結果。

與第一次請求的區別是:省去了建立連接的過程,直接發送reids命令,得到結果! 再使用lsof -n -p 28082查看fpm打開的文件描述符,結果與上文件相同。 說明,連接的確是被重用的,沒有新建。

執行第6次頁面請求(因為我們在準備工作中的配置,此時fpm已經是一個新的進程了),用lsof查看進程打開的文件描述符。 我們發現,雖然仍然有描述符為9的reids連接,但兩個tcp連接的臨時端口不同了,也就是連接改變了!

至此,我們得出問題1的結論: 當使用pconnect時,連接會被重用,連接的生命周期是fpm進程的生命周期,而非一次php的執行。。

測試問題2

為了對比,我們先看一下,使用connect連接redis,并調用redis->close()的系統調用。(將上述代碼中的pconnect改為connect, 同時在最后加入redis->close())

我們看到,除了建立連接外,在程序結尾,還向reids發送了quit命令,并關閉了連接的文件描述符。

接下來,我們看在使用pconnect后,redis->close()有何表現 代碼調整為: 復制代碼

$ip = "10.136.30.144";$port = 7777;$redis = new Redis();$redis->pconnect($ip, $port, 1);$key = "test";$value = "this is test";$redis->set($key, $value);$d = $redis->get($key);var_dump($d);$redis->close();try { $redis->get($key);} catch (Exception $e) { echo $e->getMessage();}

復制代碼

我們直接看第2次執行頁面請求的系統調用

并沒有建立連接,同樣是直接發送命令得到結果。說明連接被重用。同時,沒有向reids server發送quit命令,也無關閉連接的系統調用。 但注意,頁面請求的返回結果:

至此,我們得出問題2的結論: 如果代碼中使用pconnect, close的作用僅是使當前php不能再進行redis請求,但無法真正關閉redis長連接,連接在后續請求中仍然會被重用,直至fpm進程生命周期結束。

結論

當使用pconnect時,連接會被重用,連接的生命周期是fpm進程的生命周期,而非一次php的執行。 2.如果代碼中使用pconnect, close的作用僅是使當前php不能再進行redis請求,但無法真正關閉redis長連接,連接在后續請求中仍然會被重用,直至fpm進程生命周期結束。

轉自:http://blog.csdn.net/qmhball/article/details/46988111


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 中西区| 望江县| 瓦房店市| 博爱县| 会理县| 太湖县| 深水埗区| 区。| 沅江市| 阳原县| 松江区| 卫辉市| 林周县| 镇沅| 大悟县| 蒲江县| 惠来县| 临夏市| 治多县| 乌兰县| 广丰县| 汉沽区| 保德县| 湾仔区| 梨树县| 云龙县| 来宾市| 杭州市| 定日县| 赤城县| 额尔古纳市| 浙江省| 齐河县| 嘉禾县| 潜山县| 青海省| 车险| 阿拉善右旗| 临沂市| 宣汉县| 仙游县|