Server push 前一段時間炒得很熱的“推”技術(shù),不過網(wǎng)上大部分都是cgi的資料,偶爾看到一個法國的網(wǎng)站上有這么個介紹,可惜法語看不懂,只能從他的程序中看懂點東西,現(xiàn)整理個例子出來大家學(xué)習(xí)一下??梢杂糜诹奶焓业臄?shù)據(jù)傳輸、網(wǎng)站上的新聞更新、等等各類更新頻繁的頁面。
以前做刷新主要通過頁面上加標(biāo)簽。
< META HTTP-EQUIV=REFRESH CONTENT="time;URL=url" >
或者使用javascript的timeout+reload,不過這種刷新的方法取決于時間的設(shè)定,無法連續(xù)的數(shù)據(jù)傳輸且時間不好確定。采用了Server push的服務(wù)器在客戶機做出一個請求后,和客戶機建立一個永久的連接,然后服務(wù)器會根據(jù)客戶機的請求不斷地把數(shù)據(jù)包推向服務(wù)器。那些你覺察不到的延遲會讓你覺得服務(wù)器的響應(yīng)和你的請求已經(jīng)達到了同步的程度。
先來看一下例子再解釋。
img.php
< ?php
set_time_limit(0);
$file = "./1.jpg";
$sep = "gIrLsKiCkAsSiTsAySsOoNaTsHiRt";
if(ereg(".*MSIE.*",$HTTP_SERVER_VARS["HTTP_USER_AGENT"])){
//如果是ie瀏覽器,直接輸出就退出,IE的不支持哦,我沒試出來過
header("Cache-Control: no-cache");
header("Pragma: no-cache");
header("Content-type: image/jpeg");
header("Content-size: " . filesize($file));
readfile($file);
}else{
header("Content-Type: multipart/x-mixed-replace; boundary=$sep");
//這里是關(guān)鍵哦,看看MIME類型說明
//你會明白
print "--$sep
";
do{
print "Content-Type: image/jpeg
";
readfile($file);
print "
--$sep
";
flush();
$mt = filemtime($file);
do{
sleep (1);
clearstatcache();
}while($mt == filemtime($file));
}while(1);
}
? >
這就是一個永久執(zhí)行的頁面(網(wǎng)絡(luò)不斷的情況下),不斷輸出圖片的內(nèi)容,下面是調(diào)用的頁面。,然后打開你的netscape或其他非ie瀏覽器查看調(diào)用頁面,好象沒什么變化啊,別急,接著就是怎樣變動1.jpg這個圖片了,寫個另外的php頁面來測試吧,比如弄2張圖片按時間來覆蓋1.jpg(這個方法自己想,用拷貝覆蓋也行,只要1.jpg有變化)。這時你就看到調(diào)用頁面的圖片自動更新了。
使用中你會發(fā)現(xiàn)個問題:怎么圖片不自動更新了。這是由于客戶機在一段時間內(nèi)沒有對服務(wù)器發(fā)生請求,也就是某一段時間內(nèi)沒有新的內(nèi)容向瀏覽器輸入,可能發(fā)生連接超時現(xiàn)象。什么辦法解決呢?可以在執(zhí)行頁面中加個向瀏覽器發(fā)送一個空信號,類似ftp連接方式,上面頁面中在do...while(1)間加個print("");
看完這個例子,應(yīng)該知道怎么處理不斷更新的內(nèi)容了,關(guān)鍵在img.php頁面中的處理(可以是檢查新的內(nèi)容并輸出),調(diào)用的時候可以有img、script、frame等等。詳細的其他使用方面請查看:http://www.npds.org/。