Php, ajax veya javascript ilerleme yükleniyor?

5 Cevap php

Herhangi bir sistem hala sunucu tarafında veri alma ise benim istemci tarafında tamamlanan% ile yükleme işlemini görüntülemek nasıl biliyorum.

Ben istemci tarafında 'Tamam' düğmesine basın Örneğin, bu veritabanından veri toplamak için sunucu tarafında arayacak, tüm süreç 3 dakika için 2 sürebilir. (Kaç% loding arasında yapılmıştır hakkında) nasıl istemci tarafında yükleme ilerlemesini görüntüleyebilir?

Ben php, ajax veya javascript nasıl yapabilirim?

5 Cevap

Eğer "Tamam" butonuna tıkladıktan sonra, veri sunucu tarafında getiriliyor başlangıç ​​ve oturumunda yüklenen yüzdesini tutmak olabilir.

Bu şekilde, yüklenen yüzdesini dönen başka bir php komut dosyası için AJAX üzerinden bir istek yapabilir istemci tarafı.

Sen (veri ve yüzdesini almak için başka getirmek için bir) 2 sunucu tarafı komut ile sonuna kadar ve bir AJAX isteği istemci tarafında olur.

O kolay bir çözüm olduğunu düşünüyorum ve ince bunu yapmalıdır.

Ajax veri indirme ilerlemesini izleme - - Ben aynı şey yapılabilir ihtiyaç yüzden ben birisi bu konuya çarpar durumda kullanılan bir çözüm sonrası edeceğiz:

var req = new XMLHttpRequest();

req.addEventListener("progress", onUpdateProgress, false);
req.addEventListener("load", onTransferComplete, false);
req.addEventListener("error", onTransferFailed, false);
req.addEventListener("abort", onTransferAborted, false);

req.open("GET", ..., true);

...

req.send()

function onUpdateProgress(e) {
  if (e.lengthComputable) {
    var percent_complete = e.loaded/e.total;
    document.getElementById("progressMessage").value = Math.round(percentComplete*100) +"% [ " + Math.round(e.loaded / 1000) + " KB ]";
    ...
  } else {
    // Length not known, to avoid division by zero
  }
}

function onTransferComplete(e) { ... }

function onTransferFailed(e)   { ... }

function onTransferAborted(e)  { ... }

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:

  1. Müşteri: ajax arama uzun süren eylemin başlangıcını talep
  2. Sunucu: uzun süren eylem başlatmak, echo% 0, flush(); (script fesih olmadan)
  3. 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!
  4. server: x hareket yüzdesini hesaplamak sonra, echo ve flush();
  5. Müşteri: # 3 bkz
  6. Sunucu: komut dosyası tamamlandığında ise, sona
  7. 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.

Ben sonuçları sayfalama bunu.

First request is to get a count. Then break up the request into a set of groups. Then start requesting the groups one at a time.

For example: if there are 100 records to return, I break them up into groups of 10. Then I can easily display 10% ... 20%...etc

Bunu yapmak için yine de bilmiyorum.

ajax isteği çalışırken jQuery bir açılış ekranı (div) görüntüleyebilirsiniz. Bu. AjaxStart ve. AjaxEnd (veya. AjaxStop) veya daha karmaşık bir yaklaşım ile her istek için yapılabilir Dojo en dojo.io.bind kullanın ya da aşağıdaki Periyodik Yenile Desen takip etmektir.

Periodic Refresh