2009-06-03 61 views
12

我是否需要傳回任何HTTP標頭以告訴瀏覽器我的服務器不會立即關閉連接並在收到HTML時顯示?是否有必要讓HTML像flush()一樣增量顯示?如何長時間遞增地向瀏覽器顯示HTML?

此技術曾用於聊天等事情,但我正在考慮將它用於COMET類型的應用程序。

回答

14

Long polling是一種常見的技術來做這樣的事情;簡單地總結一下,它的工作原理如下:

  1. 客戶端發送一個XHR到服務器。

    • 如果數據準備就緒,服務器立即返回。
    • 如果沒有,服務器會保持連接處於打開狀態,直到數據變爲可用狀態,然後返回該狀態。
    • 如果請求超時,回到1)。
  2. 客戶端上運行的頁面接收到這些數據,並執行它的操作。

  3. 回到1)

這就是Facebook如何implements its chat feature

This article也清除了長輪詢的一些誤解,並詳細說明了這樣做的一些好處。

0

根據你在做什麼,你可以在你的腳本進行時回聲,然後這個html會回傳給瀏覽器。

1

我認爲一個更強大的解決方案是一個帶有Javascript計時器的頁面,該計時器輪詢服務器以獲取新數據。保持響應打開不是HTTP協議設計的。

+0

在發佈我的文章後,我看到了這個,肯定是更好的答案,你可以有一個DIV,你可以使用JavaScript繼續填充一些AJAX內容 – bdwakefield 2009-06-03 13:24:23

+0

Polling會對於像聊天這樣的事情來說,這是一個非常糟糕的解決方案,其中暫停可能會有很大差異,並且您希望響應快速出現但是同時避免了數千客戶經常進行民意調查而給服務器造成負擔,而這些客戶大多數時間都沒有返回任何東西。使用HTTP協議的東西不是爲工作而設計的,在這種情況下是更好的解決方案。 – 2009-06-03 13:31:54

1

我只是迴應/打印HTML,因爲我去了。有幾種不同的方式可以讓腳本在發送下一個位之前暫停。您不需要使用標頭或任何特殊代碼來做任何事情來告訴瀏覽器等待。只要腳本仍在運行,它將呈現從腳本接收到的HTML。

echo "<HTML><HEAD.../HEAD><BODY>"; 
while (running) 
{ 
    echo "printing html... </br>"; 
} 
echo "</BODY></HTML>"; //all done 
0

我建議你調查使用Ajax而不是普通的舊HTML來實現這樣的功能。這允許您在架構設計和用戶界面方面擁有更大的靈活性

2

當客戶端在一段時間內沒有收到任何數據時,它將關閉連接。這個超時不能被HTTP標頭影響。它是客戶特定的,通常設置爲120秒IIRC。

所以你所要做的就是定期發送少量數據以避免超時。

1

嘗試永遠框架(例如在Gmail中)

這些工藝的所有都只是黑客,HTTP不是設計來做到這一點。

1

在腳本的末尾,使用這樣的(假設你已經輸出通過在頁面頂部

<?php 

set_time_limit(0); // Stop PHP from closing script after 30 seconds 

ob_start(); 

echo str_pad('', 1024 * 1024, 'x'); // Dummy 1 megabyte string 

$buffer = ob_get_clean(); 

while (isset($buffer[0])) { 

$send = substr($buffer, 0, 1024 * 30); // Get 30kbs bytes from buffer :D 
$buffer = substr($buffer, 1024 * 30); // Shorten buffer 

echo $send; // Send buffer 
echo '<br />'; // forces browser to reload contents some how :P 

ob_flush(); // Flush output to browser 
flush(); 

sleep(1); // Sleep for 1 second 

} 

?> 

該腳本主要輸出在30kbs 1兆字節的文字把ob_start()緩衝上(模擬)無論用戶和服務器的連接速度有多快

相關問題