2016-10-01 2 views
1

ich ein SAAS Szenario mit meinem Windows-Server implementiert haben: ein Benutzer eine Datei in a website hochladen können, dann Fetch.exe eine Anwendung codiert ist in C# in dem Server gehostet, nimmt Fetch.exe die hochgeladene Datei als Eingabe ausführt und erzeugt eine Ausgabe zum Herunterladen für den Benutzer.Fortschrittsbalken für eine Anwendung

Also in meinem php, ich benutze execFetch.exe einzuwickeln:

exec("Fetch.exe " . $inputFile . " > " . $outputFile) 

Hochladen und Ausführen (dh Fetch.exe) kann länger dauern als einige Sekunden, und ich möchte dem Benutzer zeigen, dass sie die Verarbeitung und Alles läuft gut.

Ich habe einige Threads gefunden, die zeigen, wie man einen Fortschrittsbalken für das Hochladen anzeigt. Woher weiß jemand, was ich tun könnte, um den ungefähren Fortschritt von zu zeigen? Muss ich es in kleinere Anwendungen aufteilen und mehrere exec verwenden?

+0

Wie sieht die Ausgabe von 'Fetch.exe' eigentlich aus? – LeonardChallis

+0

Es ist nur ein Text, der kurz oder lang sein kann. Um die 'inputFile' zu ​​verarbeiten und diesen Text zu erzeugen, kann es aufgrund der Analyse hinter ... mehr als ein paar Sekunden dauern. – SoftTimur

+0

Sie benötigen einen prozentualen Fortschritt oder nur eine" is loading "Information? – Cesar

Antwort

2

Sie könnten liefern mit einer zufällig generierten ID von PHP, zum Beispiel aus der uniqueid Funktion. Fetch.exe wird eine Datei mit dem Namen <uniqueid>.txt mit einem Fortschrittsprozentsatz erstellen. Über den Browser können Sie ein anderes Skript mit dieser eindeutigen ID aufrufen, um den Inhalt dieser TXT-Datei abzurufen. Um wäre es so etwas wie dieses:

  • User-Uploads, die Datei zu PHP
  • PHP:
    • nimmt die hochgeladene Datei
    • eine uniqueID
    • beginnt Fetch.exe schafft mit Die Datei und die eindeutige ID
    • gibt eine Seite mit der eingebetteten uniqueID zurück

passiert Folgendes parallel:

  • Fetch.exe eine Text-Datei /progress/uniqueid.txt mit dem uniqueid als Namen genannt erzeugt. Es protokolliert den Fortschritt darin.
  • Der Browser macht einen AJAX-Aufruf zu http://example.com/progress/uniqueid.txt und zeigt den Fortschritt an den Benutzer

Und schließlich, wenn der Fortschritt 100% erreicht lädt der Browser die Datei. Die einzige Sache, die Sie vielleicht hinzufügen möchten, ist das Beschneiden der Fortschrittsdateien nach einer Weile. Angenommen, Sie löschen alle Dateien, die jede Stunde älter als 10 Minuten sind.

1

Ihr PHP-Programm benötigt eine Möglichkeit, den Status des Subprozesses (die Fetch.exe-Anwendung) zu kennen, also muss Fetch.exe Informationen über den Verarbeitungsstatus senden, der natürlichste Weg ist der Standard Ausgabe (die Standardausgabe ist die Information, die ein Programm bereitstellt, wenn Sie es von cmd ausführen).

Mit diesem Wissen können Sie eine subprocess output from php using popen() ausführen und lesen.

Und secod, können Sie die PHP ob_flush() und flush() mit den onmessage javascript event verwenden, um die Komunikation von Ihrer Client-Seite mit Ihrem laufenden PHP-Skript zu etablieren, here Sie eine gute Anleitung, wie man dies tun geben.

Verwandte Themen