判斷Keep-Alive模式的HTTP請(qǐng)求的結(jié)束的實(shí)現(xiàn)代碼
更新時(shí)間:2011年08月06日 23:18:18 作者:
在使用短連接方式時(shí),每個(gè)HTTP請(qǐng)求對(duì)應(yīng)一個(gè)TCP連接,請(qǐng)求完成后連接立即斷開,服務(wù)器返回EOF。
所以根據(jù)EOF就可判斷一次請(qǐng)求的結(jié)束,下面的代碼(PHP)很常見:
// $fp是由fsockopen()產(chǎn)生的句柄
while(!feof($fp)) {
echo fgets($fp);
}
(注:短連接模式是在頭部用”Connection: close”標(biāo)示,長(zhǎng)連接用”Connection: keep-alive”標(biāo)示。目前HTTP/1.0默認(rèn)使用短連接,HTTP/1.1默認(rèn)使用長(zhǎng)連接。)
而長(zhǎng)連接(也稱持久連接)模式的HTTP在發(fā)送完數(shù)據(jù)后服務(wù)器并不斷開連接,而是留著下一次HTTP請(qǐng)求時(shí)使用,所以長(zhǎng)連接的好處是顯而易見的,通過共用一個(gè)TCP連接來節(jié)省以后請(qǐng)求時(shí)建立/斷開連接的開銷。而EOF是直到這個(gè)TCP連接結(jié)束(超時(shí)或出錯(cuò))時(shí)才會(huì)被發(fā)送,所以我們就不能使用上面的辦法來判斷一次HTTP請(qǐng)求的結(jié)束了。這也是使用長(zhǎng)連接時(shí)都會(huì)遇到的一個(gè)問題。目前判斷的方法主要有兩種:
(1) 根據(jù)頭中的Content-Length字段。這個(gè)字段標(biāo)明了正文的長(zhǎng)度,我們可以以接收完指定長(zhǎng)度的字符為判斷結(jié)束的依據(jù)。
(2) 在沒有Content-Length時(shí),根據(jù)Transfer-Encoding。有些時(shí)候服務(wù)器無法確定正文的大小,因?yàn)檎目赡苁莿?dòng)態(tài)產(chǎn)生的,所以就不會(huì)提供Content-Length了,而是采用chunk編碼來一塊一塊地發(fā)送正文。每個(gè)chunk塊由頭部和正文兩部分組成,頭部中由一個(gè)16進(jìn)制數(shù)字指定了正文的長(zhǎng)度;最后由一個(gè)長(zhǎng)度為0的chunk塊來表示整個(gè)HTTP正文的結(jié)束。
下面我用PHP實(shí)現(xiàn)了有Content-Length時(shí)的判斷方式:
1. 獲得Content-Length值
$length = 0;
$line = '';
while($line !== "\r\n") {
$line = fgets($fp);
if(substr($line, 0, 15) === 'Content-Length:') {
$length = intval(substr($line, 16));
}
}
2. 獲得正文
$sum = 0;
while($sum < $length) {
$line = fgets($fp);
$sum += strlen($line);
echo $line;
}
復(fù)制代碼 代碼如下:
// $fp是由fsockopen()產(chǎn)生的句柄
while(!feof($fp)) {
echo fgets($fp);
}
(注:短連接模式是在頭部用”Connection: close”標(biāo)示,長(zhǎng)連接用”Connection: keep-alive”標(biāo)示。目前HTTP/1.0默認(rèn)使用短連接,HTTP/1.1默認(rèn)使用長(zhǎng)連接。)
而長(zhǎng)連接(也稱持久連接)模式的HTTP在發(fā)送完數(shù)據(jù)后服務(wù)器并不斷開連接,而是留著下一次HTTP請(qǐng)求時(shí)使用,所以長(zhǎng)連接的好處是顯而易見的,通過共用一個(gè)TCP連接來節(jié)省以后請(qǐng)求時(shí)建立/斷開連接的開銷。而EOF是直到這個(gè)TCP連接結(jié)束(超時(shí)或出錯(cuò))時(shí)才會(huì)被發(fā)送,所以我們就不能使用上面的辦法來判斷一次HTTP請(qǐng)求的結(jié)束了。這也是使用長(zhǎng)連接時(shí)都會(huì)遇到的一個(gè)問題。目前判斷的方法主要有兩種:
(1) 根據(jù)頭中的Content-Length字段。這個(gè)字段標(biāo)明了正文的長(zhǎng)度,我們可以以接收完指定長(zhǎng)度的字符為判斷結(jié)束的依據(jù)。
(2) 在沒有Content-Length時(shí),根據(jù)Transfer-Encoding。有些時(shí)候服務(wù)器無法確定正文的大小,因?yàn)檎目赡苁莿?dòng)態(tài)產(chǎn)生的,所以就不會(huì)提供Content-Length了,而是采用chunk編碼來一塊一塊地發(fā)送正文。每個(gè)chunk塊由頭部和正文兩部分組成,頭部中由一個(gè)16進(jìn)制數(shù)字指定了正文的長(zhǎng)度;最后由一個(gè)長(zhǎng)度為0的chunk塊來表示整個(gè)HTTP正文的結(jié)束。
下面我用PHP實(shí)現(xiàn)了有Content-Length時(shí)的判斷方式:
1. 獲得Content-Length值
復(fù)制代碼 代碼如下:
$length = 0;
$line = '';
while($line !== "\r\n") {
$line = fgets($fp);
if(substr($line, 0, 15) === 'Content-Length:') {
$length = intval(substr($line, 16));
}
}
2. 獲得正文
復(fù)制代碼 代碼如下:
$sum = 0;
while($sum < $length) {
$line = fgets($fp);
$sum += strlen($line);
echo $line;
}
相關(guān)文章
Windows平臺(tái)實(shí)現(xiàn)PHP連接SQL Server2008的方法
這篇文章主要介紹了Windows平臺(tái)實(shí)現(xiàn)PHP連接SQL Server2008的方法,結(jié)合實(shí)例形式分析了Windows平臺(tái)PHP連接SQL Server2008所需的相關(guān)dll動(dòng)態(tài)鏈接庫(kù)文件及相應(yīng)的配置與使用方法,需要的朋友可以參考下2017-07-07php下用cookie統(tǒng)計(jì)用戶訪問網(wǎng)頁次數(shù)的代碼
利用cookie統(tǒng)計(jì)用戶訪問網(wǎng)頁次數(shù)的代碼,需要的朋友可以參考下。作為學(xué)習(xí)cookies的資料,不推薦使用。2010-05-05PHP設(shè)計(jì)模式之組合模式定義與應(yīng)用示例
這篇文章主要介紹了PHP設(shè)計(jì)模式之組合模式定義與應(yīng)用,結(jié)合實(shí)例形式詳細(xì)分析了PHP組合模式基本原理、定義與使用方法,需要的朋友可以參考下2020-02-02PHP const定義常量及global定義全局常量實(shí)例解析
這篇文章主要介紹了PHP const定義常量及global定義全局常量實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05php自定義類fsocket模擬post或get請(qǐng)求的方法
這篇文章主要介紹了php自定義類fsocket模擬post或get請(qǐng)求的方法,涉及php使用socket模擬post及get請(qǐng)求的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07完美解決dedecms中的[html][/html]和[code][/code]問題
完美解決dedecms中的[html][/html]和[code][/code]問題...2007-03-03