o kadar kolay değil. ajax arama işlemini başlatır eğer, bir yığın halinde / çok parçalı yanıtı (ki çoğu dhtml sohbetler uygulanmaktadır nasıl) yapabilirdi. "COMET" için google.
temelde bu gibi çalışır:
- Müşteri: ajax arama uzun süren eylemin başlangıcını talep
- Sunucu: uzun süren eylem başlatmak,
echo
% 0, flush();
(script fesih olmadan)
- Müşteri: kızardı içeriği (özel callback) ile bir yanıt aldı, değerini görüntüler ve ancak bağlantı açık kalır!
- server: x hareket yüzdesini hesaplamak sonra,
echo
ve flush();
- Müşteri: # 3 bkz
- Sunucu: komut dosyası tamamlandığında ise, sona
- müşteri: komut sonu için normal bir olay / geri arama. % 100, açık sonraki sayfayı görüntülemek
ben bir kez (javascript uyumsuz hala yeni iken!) şimdi biraz feshedilmiş bulunuyor ... biraz demo kodlu, ama uyumsuz kısmı hala çalışıyor. Bunu burada bulabilirsiniz: http://wehrlos.strain.at/httpreq/client.html
kullanılan javascript kodu clientside
function asSendSyncMulti() {
var httpReq = new XMLHttpRequest();
showMessage( 'Sending Sync Multipart ' + (++this.reqCount) );
// Sync - wait until data arrives
httpReq.multipart = true;
httpReq.open( 'GET', 'server.php?multipart=true&c=' + (this.reqCount), false );
httpReq.onload = showReq;
httpReq.send( null );
}
function showReq( event ) {
if ( event.target.readyState == 4 ) {
showMessage( 'Data arrives: ' + event.target.responseText );
}
else {
alert( 'an error occured: ' + event.target.readyState );
}
}
Çok parçalı bölümü için serverside php kodu:
<?php
$c = $_GET[ 'c' ];
header('Content-type: multipart/x-mixed-replace;boundary="rn9012"');
sleep( 1 );
print "--rn9012\n";
print "Content-type: application/xml\n\n";
print "<?xml version='1.0'?>\n";
print "<content>Multipart: First Part of Request " . $c . "</content>\n";
print "--rn9012\n";
flush();
sleep( 3 );
print "Content-type: application/xml\n\n";
print "<?xml version='1.0'?>\n";
print "<content>Multipart: Second Part of Request " . $c . "</content>\n";
print "--rn9012--\n";
?>
olası bir yönde bir dürtmek daha fazla bir şey değil. html-uyumlu olmayan veya çapraz browsery. json yerine xml kullanın.
sunucu tarafında, (sıkıştırma için örneğin) çıkış önbelleği aksi flush();
hiçbir şey yapmayacağım, kapalı olmalıdır. ve --rn9012
(sadece ilerlemesini görüntülemek ama yine de eğer unlikley) sizin outputted veri occures hiç bir şey olmalıdır.