Uzun bir süre boyunca aşamalı olarak tarayıcıya HTML görüntülemek için?

8 Cevap php

Benim sunucu hemen bağlantıyı kapatmadan olmayacak tarayıcı anlatmak ve HTML alındığı gibi görüntülemek için herhangi bir HTTP başlıklarını geri geçmek gerekir mi? ) HTML aşamalı (fışkırma gibi görüntü almak için gerekli olan bir şey var mı?

Bu teknik, sohbet gibi şeyler için kullanılmak üzere kullanılan, ama ben bir COMET tip uygulama için kullanıyorum düşünüyorum.

8 Cevap

Long polling Böyle bir şey yapmak için ortak bir tekniktir; kısaca şu şekilde özetlemek, çalışır:

  1. İstemci sunucuya XHR'nin gönderir.

    • Veri hazır varsa, sunucu hemen bu döndürür.
    • Değilse Eldeki hale gelir kadar, sunucu bağlantıyı açık tutar, o zaman bu döndürür.
    • Istek zaman aşımına ise) tekrar 1'e gidin.
  2. Istemci üzerinde sayfa çalışan bu verileri alır ve onunla ne yapar.

  3. 1 geri dön)

Bu nasıl Facebook implements its chat feature.

This article aynı zamanda uzun yoklama yanlış bazı temizler, ve bunu yapmanın yararlarından bazıları ayrıntıları.

Belirli bir süre için herhangi bir veri almadığı zaman, istemci bağlantıyı kapatır. Bu zaman aşımı HTTP başlıkları etkisinde olamaz. Bu istemci-spesifik ve genellikle 120 saniye IIRC ayarlıdır.

Yani tüm yapmanız gereken düzenli olarak zaman aşımı çarpmamak için küçük miktarlarda veri göndermek.

Ben daha sağlam bir çözüm olduğunu yoklar yeni veriler için sunucu bir Javascript zamanlayıcı ile bir sayfa olduğunu düşünüyorum. Açık yanıtı tutulması HTTP protokolü için tasarlanmış bir şey değildir.

Olarak ben gittim ben sadece / baskı HTML yankı. Eğer bir sonraki bit göndermeden önce komut duraklama olabilir birkaç farklı yolu vardır. Üstbilgi veya beklemek tarayıcı anlatmak için herhangi bir özel kod ile bir şey yapmak gerekmez. Sürece komut olarak hala o komut aldığı HTML işlemek olacaktır çalışıyor.

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

(Gmail gibi) çerçeve sonsuza deneyin

Bu tekniklerin hepsi sadece kesmek, http bunu yapmak için tasarlanmış değildir vardır.

senaryonun sonunda, sayfanızın en üstünde sizi ob_start (koyarak üzerine tampon çıkışı vardı varsayarak böyle bir şey () kullanın

<?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

}

?>

Bu komut dosyası temelde olursa olsun kullanıcı ve sunucu bağlantınız ne kadar hızlı (taklit) 30kbs de metnin 1 megabayt çıktılar.

O yankılandı olarak ne yapıyorsun bağlı olarak, sadece komut ilerledikçe yankı olabilir, bu daha sonra tarayıcıya html göndereceğiz.

Seni çok düz eski HTML dışında, Ajax kullanarak bu tür işlevselliği uygulama araştırmak öneririm. Bu size mimari tasarım ve kullanıcı arayüzü açısından çok daha fazla esneklik sağlar