2015-11-11 50 views
0

我做一個AJAX請求,並根據答案,我會刷新當前頁面,代碼是這樣的:XMLHttpRequest的不緊密連接

var xhttp = new XMLHttpRequest(); 
xhttp.onreadystatechange = function() { 
if (xhttp.readyState == 4 && xhttp.status == 200) { 
    var res = xhttp.responseText; 
    if (res.length > 0) { 
     window.location = res; 
    } 
} 
} 
xhttp.open("POST", "getlink.php", true); 
xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
xhttp.send('id='+id); 

但是我注意到,連接不會關閉服務器。當運行這個命令:

netstat -anl | grep 80 | awk '/^tcp/ {t[$NF]++}END{for(state in t){print state, t[state]} }' 

我看到了很多的連接在TIME_WAIT狀態:

LAST_ACK 4 
LISTEN 2 
SYN_RECV 2 
ESTABLISHED 1421 
FIN_WAIT1 9 
FIN_WAIT2 17 
TIME_WAIT 2250 

這似乎是XMLHttpRequest的不有着密切的聯繫創造了大量的服務器上的問題。

回答

3

這不是一個錯誤,它是一個功能!

它被稱爲Connection keep-alive,它是HTTP協議的一項功能,適用於所有HTTP連接,而不僅僅是由XMLHttpRequest創建的連接。

所以基本上這個想法是打開一個TCP連接是一件很複雜的事情,因爲你需要進行昂貴的三向握手來建立一個連接並分配系統資源。但是,大多數網頁一次加載許多資源。它是每個圖像的一個請求,每個CSS文件都有一個請求等等。爲了加快加載速度並減少服務器負載,HTTP允許與服務器的連接保持打開狀態,並可用於後續請求。

使用來自服務器的頭文件來控制行爲,該頭文件指定客戶端應該在最大時打開多少個連接,並在關閉連接的空閒時間後多少秒。如果你發現你的服務器有太多的連接問題,你應該調整這些頭文件,這些頭文件通常可以在你的網絡服務器配置文件中配置。

+0

優秀!謝謝!你知道我應該在nginx/php5fpm配置上修改什麼設置嗎? –

+0

請參閱keepalive_disable,keepalive_requests和keepalive_timeout指令:http://nginx.org/en/docs/http/ngx_http_core_module.html#keepalive_disable但是請注意,如果要處理大量的併發請求,nginx是功能最強大的服務器之一連接,所以檢查這確實是你的問題... – yankee

+0

我設法通過調整一些sysctl設置來減少TIME_OUT連接的數量。我的服務器有一些非常糟糕的默認值:net.ipv4.tcp_max_tw_buckets只有8192和net.ipv4.tcp_tw_reuse是0(tcp套接字不重用)。改變它們後,服務器連接性有所改善感謝您指點我正確的方向! –