程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 判斷Keep-Alive模式的HTTP請求的結束

判斷Keep-Alive模式的HTTP請求的結束

編輯:關於PHP編程

在使用短連接方式時,每個HTTP請求對應一個TCP連接,請求完成後連接立即斷開,服務器返回EOF。所以根據EOF就可判斷一次請求的結束,下面的代碼(PHP)很常見:

Copy to ClipboardLiehuo.Net Codes引用的內容:[www.bkjia.com] // $fp是由fsockopen()產生的句柄
while(!feof($fp)) {
echo fgets($fp);
}

(注:短連接模式是在頭部用”Connection: close”標示,長連接用”Connection: keep-alive”標示。目前HTTP/1.0默認使用短連接,HTTP/1.1默認使用長連接。)

而長連接(也稱持久連接)模式的HTTP在發送完數據後服務器並不斷開連接,而是留著下一次HTTP請求時使用,所以長連接的好處是顯而易見的,通過共用一個TCP連接來節省以後請求時建立/斷開連接的開銷。而EOF是直到這個TCP連接結束(超時或出錯)時才會被發送,所以我們就不能使用上面的辦法來判斷一次HTTP請求的結束了。這也是使用長連接時都會遇到的一個問題。目前判斷的方法主要有兩種:

(1) 根據頭中的Content-Length字段。這個字段標明了正文的長度,我們可以以接收完指定長度的字符為判斷結束的依據。
(2) 在沒有Content-Length時,根據Transfer-Encoding。有些時候服務器無法確定正文的大小,因為正文可能是動態產生的,所以就不會提供Content-Length了,而是采用chunk編碼來一塊一塊地發送正文。每個chunk塊由頭部和正文兩部分組成,頭部中由一個16進制數字指定了正文的長度;最後由一個長度為0的chunk塊來表示整個HTTP正文的結束。

下面我用PHP實現了有Content-Length時的判斷方式:

1. 獲得Content-Length值

Copy to ClipboardLiehuo.Net Codes引用的內容:[www.bkjia.com] $length = 0;
$line = '';
while($line !== "\r\n") {
$line = fgets($fp);
if(substr($line, 0, 15) === 'Content-Length:') {
$length = intval(substr($line, 16));
}
}

2. 獲得正文

Copy to ClipboardLiehuo.Net Codes引用的內容:[www.bkjia.com] $sum = 0;
while($sum < $length) {
$line = fgets($fp);
$sum += strlen($line);
echo $line;
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved