2014-02-25 5 views
5

Ich möchte den Status eines PHP-Skripts regelmäßig überprüfen und im Browser anzeigen. Hier ist die jQuery, die zum Posten verwendet wird.Fortschritt des von jQuery post aufgerufenen PHP-Skripts

$(document).ready(function() { 
     $("#tempbut").click(function(event){ 
      $('#loader').show(); 
      $('#mainarea').hide('fast'); 

      $.post(
      "template.php", 
      { 
       guide : $('#guide').val(), 
       title : $('#title').val() 
      }, 
      function(data) { 
       $('#mainarea').empty(); 
       $('#loader').fadeOut('slow'); 
       $('#mainarea').append(data); 
       $('#mainarea').show('slow'); 
      } 

     ); 
     }); 
    }); 

In dem PHP-Script (nicht veröffentlicht), Echo mir Aussagen wie „Bauanfrage ...“, „Anfrage senden ...“, um den Benutzer über den Fortschritt zu informieren. Wenn ich jQuery-Post nicht verwenden würde, könnte ich nach jedem Echo den Status mit flush() und obflush() anzeigen. Vielleicht liegt es daran, dass der Callback darauf wartet, dass das Skript vollständig ausgeführt wird, bevor es ausgegeben wird?

Gibt es eine Möglichkeit, die vorhandene jQuery .post zu ändern, um dies zu tun? Ich sehe ein paar Beispiele mit .ajax, aber nicht .post.

Wenn .ajax der einzige Weg ist, dies zu tun, wie würde ich diesen Code ändern?

Danke!

BEARBEITEN: Got it running! Hoffentlich wird jemand das hilfreich finden.

test.html

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset="UTF-8" /> 
    <title>TEST</title> 
    <meta http-equiv="X-UA-Compatible" content="IE=edge;chrome=1" /> 
    <script src="http://code.jquery.com/jquery-2.1.0.js"></script> 
    <script> 
     $.ajax({ 
      url: "test.php", 
      xhrFields: { 
       onprogress: function(e) { 
        console.log(e.target.responseText) 
        $("body").html(e.target.responseText) 
        if (e.lengthComputable) { 
         console.log(e.loaded/e.total * 100 + '%'); 
        } 
       } 
      }, 
      success: function(text) { 
        console.log(text) 
        $("body").html(text+"<h1>done!</h1>") 
      } 
     }); 
    </script> 
</head> 
<body> 
<div id="derp">TEST!</div> 

</body> 
</html> 

test.php

<?php 

for($i = 0; $i<20 ; $i++){ 
    sleep(1); 
    echo $i."</br>"; 
    flush(); 
    ob_flush(); 
} 
?> 
+0

Upvote auch für Sie! – MonkeyZeus

Antwort

3

Post ist eine Abkürzung für Ajax (Sie können console.log löschen) (Typ: post), nichts anderes .

um einen Fortschrittsbericht zu bekommen, gibt es einige Möglichkeiten. Die einfachste, die jetzt zu meiner kommen, ist 2 ajax request 1 auf die gleiche Seite zu machen, um dein php-Skript zu laufen und den Status in Session und anderen auf einer anderen Seite zu speichern Dieser liest den Status aus der Sitzung und druckt ihn für den Benutzer aus.

UPDATE:

ohhhh meine schlechte Sitzung wird nicht abgeschrieben, bis das PHP-Skript beendet ist. Sie können versuchen, den Status in eine Datei zu schreiben und daraus wie folgt zu lesen:

task.php

for ($i = 0; $i < 10; $i++) { 
    echo($i . "<br/>"); 
    file_put_contents('progress', $i); 
    sleep(2); 
} 

progress.php

if (file_exists('progress') && is_readable('progress')) 
    echo file_get_contents('progress'); 
else 
    echo(-1); 

und das Skript:

<script> 
    $(document).ready(function() { 
     task(); 
     getProgress(); 
    }); 
    function task() { 
     $.ajax({ 
      url: 'http://localhost/test/progress/task.php', 
      success: function (data) { 
       console.log('Task is over :' + data); 
      } 
     }); 
    } 
    function getProgress() { 
     $.ajax({ 
      url: 'http://localhost/test/progress/progress.php', 
      success: function (data) { 
       data = parseInt(data); 
       if (data != 9) { 
        console.log('progress :' + data); 
        setTimeout(function() { 
         getProgress(); 
        }, 1000); 
       } 
      } 
     }); 
    } 
</script> 

ABER ist eine Multi-User-Umgebung, die Probleme verursachen wird.

so das Beste, was Sie tun können, ist den Status speichern in einer der folgenden:

  • Verwendung einer Datenbank
  • Verwendung memcache
  • Verwendung APC
+1

Ich habe Ihren Vorschlag ohne Glück versucht.Ich habe das OP bearbeitet, um meinen Versuch widerzuspiegeln. Bitte schauen Sie, wann Sie eine Chance bekommen. Vielen Dank. – rawrzors

+0

aktualisiert die Antwort – Exlord

+0

Vielen Dank für die Erläuterung Ihrer Methode. Es scheint, als ob Sie eine Datei verwenden, um die Daten zu übertragen. Ich möchte Lese-/Schreibvorgänge minimieren und die Verwendung von Dateien vermeiden. Ich habe es funktioniert mit xhrFields und onprogress und machte eine Bearbeitung auf OP, um es zu reflektieren. Hoffentlich hilft es jemand anderem! – rawrzors

Verwandte Themen