[PHP] time_wait與長連接短連接


服務端上查看tcp連接的建立情況,直接使用netstat命令來統計,看到了很多的time_wait狀態的連接.這些狀態是tcp連接中主動關閉的一方會出現的狀態.該服務器是nginx的webserver監聽80端口,搭配的php-fpm監聽9000端口,連接其他服務器數據庫3960端口,連接其他服務器的memcache 50028端口.

 

先查看本機監聽80端口的time_wait狀態,可以看到不同客戶端的ip端口,來連接我的服務端,並且是我服務端主動關閉連接,因此可以看到time_wait,這些對我們服務器沒有影響.因為這是http的短連接,肯定是會請求過來就創建一個連接,請求結束就關閉連接.

網上很多說這些如果太多會占用服務器的端口,根本就是不對的,因為這些是占用的是客戶端的端口,服務端只是一個80端口,怎么會占用服務器的端口呢.
netstat -altupn|grep ":80"

 

 當然如果前面有負載均衡的話,客戶端IP是固定的幾個,可以把前面的負載均衡機器當成是客戶端.

 

當然如果我們是通過nginx的反代,反代到fpm的9000端口 , 這個時候是我們本機隨機開啟端口,連接本機的9000端口 ,這個時候是會占用本機端口數的

 

 

 

還有就是真正占用服務器端口的是,當需要連接數據庫時,比如我需要連接數據庫的3960端口,這個時候我的服務器會隨機占用本機的端口,連接遠程的3960端口.因為php連接數據庫是使用的短連接,每次請求都會在創建連接,並且是我服務端主動關閉的連接,所以會有大量time_wait狀態,這里會占用本機的端口數,連接mc的50028端口也是會出現同樣的情況.
netstat -altupn|grep ":3960"

 

 

那么如果php使用長連接連接數據庫呢?這個時候就是每一個fpm子進程創建一個連接,有多少個子進程就會有多少連接,並且連接是不會斷掉的.當然如果子進程的數量特別多,會占用mysql的連接數,所以這里我們的項目里也是使用的短連接.
show variables like 'max_connections'

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM