PHP-Push技術實現重新整理功能_PHP

來源:互聯網
上載者:User
關鍵字 重新整理 實現 技術 file header 頁面
Server push 前一段時間炒得很熱的“推”技術,不過網上大部分都是cgi的資料,偶爾看到一個法國的網站上有這麼個介紹,可惜法語看不懂,只能從他的程式中看懂點東西,現整理個例子出來大家學習一下。可以用於聊天室的資料轉送、網站上的新聞更新、等等各類更新頻繁的頁面。

以前做重新整理主要通過頁面上加標籤。

 
< META HTTP-EQUIV=REFRESH CONTENT="time;URL=url" >


或者使用javascript的timeout+reload,不過這種重新整理的方法取決於時間的設定,無法連續的資料轉送且時間不好確定。採用了Server push的伺服器在客戶機做出一個請求後,和客戶機建立一個永久的串連,然後伺服器會根據客戶機的請求不斷地把資料包推向伺服器。那些你覺察不到的延遲會讓你覺得伺服器的響應和你的請求已經達到了同步的程度。

先來看一下例子再解釋。

 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");
  //這裡是關鍵哦,看看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);
}
? >




這就是一個永久執行的頁面(網路不斷的情況下),不斷輸出圖片的內容,下面是調用的頁面。,然後開啟你的netscape或其他非ie瀏覽器查看調用頁面,好象沒什麼變化啊,別急,接著就是怎樣變動1.jpg這個圖片了,寫個另外的php頁面來測試吧,比如弄2張圖片按時間來覆蓋1.jpg(這個方法自己想,用拷貝覆蓋也行,只要1.jpg有變化)。這時你就看到調用頁面的圖片自動更新了。

使用中你會發現個問題:怎麼圖片不自動更新了。這是由於客戶機在一段時間內沒有對伺服器發生請求,也就是某一段時間內沒有新的內容向瀏覽器輸入,可能發生連線逾時現象。什麼辦法解決呢?可以在執行頁面中加個向瀏覽器發送一個空訊號,類似ftp串連方式,上面頁面中在do...while(1)間加個print("");



以上是轉的部分,由於比較有興趣,在GOOGLE上找了一下,大家可以看看下面的資料.

Requirements
Works with Apache-1.3.14/PHP4.0.3pl1 server and Various Netscape clients. Probably many other server combos. Tested on Netscape 4.7x and 6.0/Mozilla.
Does NOT WORK WITH IE. Internet Exploiter does not support x-mixed-replace server-push as far as I know. If a browser has "MSIE" in its User-Agent string the script will display one image and exit.

Update 20020108: Poked around freshmeat for a bit and found Andy Wilcock's Cambozola java applet which seems to work well with my php script to make the stream viewable under IE. Beware that the current version doesn't work under "Name-based" virtual hosts but I'll have a patch for it soon.
Source
Download

$file = "./latest.jpg";
$sep = "gIrLsKiCkAsSiTsAySsOoNaTsHiRt";

if (ereg(".*MSIE.*",$HTTP_SERVER_VARS["HTTP_USER_AGENT"]))
{
# If IE, spit out one pic and exit
header("Cache-Control: no-cache");
header("Pragma: no-cache");
header("Content-type: image/jpeg");
header("Content-size: " . filesize($file));
readfile($file);
}
else
{
# if not IE, give the browser a try
header("Content-Type: multipart/x-mixed-replace; boundary=$sep");
print "--$sep\n";
do {
print "Content-Type: image/jpeg\n\n";
readfile($file);
print "\n--$sep\n";
flush();
$mt = filemtime($file);
do {
sleep (1);
# we won't output the same image twice.
clearstatcache();
} while ($mt == filemtime($file));
} while (1);
}
?>


Make sure there are no blank lines outside the in your script. That will cause screwey headers to be sent too soon.
Reference the script in your HTML page as if it was an image:



Use this bit of PHP on the page that references the image to compensate for IE's lack of "innovation":


if (ereg("MSIE",$HTTP_SERVER_VARS["HTTP_USER_AGENT"])) {
echo "\n";
}
?>
  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.