Der Titel mag verdächtig und schwer zu verstehen sein, aber in einfachen Worten handelt es sich um eine Implementierung einer Funktion, die den Fortschritt der auf der Serverseite durchgeführten Stapelverarbeitung in Echtzeit in Form eines Fortschrittsbalkens anzeigt. Was die Methode betrifft, scheint es verschiedene Methoden zu geben, aber unter ihnen gab es diesmal keine Implementierungsmethode wie mich, daher werde ich sie vorerst veröffentlichen.
--Browser: ** Parametereingabe ** (Sprache: PHP) --Server:
Dieses Mal musste ich die ISBN des Produkts eingeben, also geben Sie die ISBN-Nummer ein und senden Sie sie in Form einer Post an den Server.
convert.php
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Convert WAV File!</title>
</head>
<body>
<form action="result.php" method="post">
<p><label>ISBN (Numeric Only) : <input type="number" name="isbn"></label></p>
<p><input type="submit" value="Submit"></p>
</form>
</body>
</html>
Auf der Serverseite ist es erforderlich, die Stapelverarbeitung gemäß den von der Browserseite erhaltenen Parametern durchzuführen und gleichzeitig ein Überwachungsskript auszuführen, um die Situation gleichzeitig zu erfassen. Daher werden zwei Skripte, Stapelverarbeitung und Überwachung, parallel gestartet.
Hinweis: Wenn die Stapelverarbeitung abgeschlossen ist, wird zum Beenden des Überwachungsskripts der Stapelverarbeitungsstatus benachrichtigt, indem die ID des Stapelverarbeitungsprozesses an das Überwachungsskript übergeben wird.
process.py
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
import os, sys, subprocess, shlex
from multiprocessing import Pool, Process, Queue
def f(logPID, q, scriptName, isbn):
q.put([os.getpid()])
os.system("sh "+scriptName+".sh "+logPID + " " + isbn)
def main():
jobs = []
q = Queue()
isbn = sys.argv[1]
#Stapelverarbeitungsteil
mainJob = Process(target=f, args=("",q,"test", isbn, ))
jobs.append(mainJob)
mainJob.start()
logPID = str(q.get()[0])
#Überwachungsteil
monitorJob = Process(target=f, args=(logPID,q,"monitor", "", ))
jobs.append(monitorJob)
monitorJob.start()
for job in jobs:
job.join()
main()
Ursprünglich bestand der Zweck dieses Programms darin, eine Stapelverarbeitung basierend auf ISBN-Informationen durchzuführen. Dieses Mal werden wir sie jedoch als Testfall durch ein Skript ersetzen, das den Verarbeitungsfortschritt in regelmäßigen Zeitintervallen als numerischen Wert ausgibt.
test.sh
#!/bin/sh
isbn=$1
touch log.txt
for i in 1 2 3 4 5 6 7 8 9 10; do
sleep 2
echo $i >> log.txt
done
Das Überwachungsskript verwendet den Befehl `` `tail```, um die der Protokolldatei hinzugefügten Zeilen in Echtzeit abzurufen und zu analysieren. Dieses Mal wird keine Verarbeitung durchgeführt, da der Fortschrittsstatus direkt im Batch-Prozess als Zahl ausgegeben wird. In der Realität wird jedoch nur der Fortschrittsstatus im Überwachungsskript verwendet, da verschiedene Informationen in der Protokolldatei sowie der Fortschrittsstatus gemischt sind. Die Verarbeitung zum Extrahieren ist erforderlich.
Hinweis: Durch Hinzufügen der Stapelverarbeitungsprozess-ID zum Befehl `` `tail``` kann das Überwachungsskript beendet werden, wenn die Stapelverarbeitung abgeschlossen ist.
monitor.sh
#!/bin/sh
pID=$1 #ID des Stapelverarbeitungsprozesses
tail -f -n 1 --pid=$pID log.txt | while read line
do
if [ -n "$line" ] ; then
echo $line
fi
done
Erfasst Überwachungsergebnisse in Echtzeit und zeigt sie in der Fortschrittsanzeige an. Schließlich werden wir den Administrator per E-Mail benachrichtigen, dass es verarbeitet wurde.
Hinweis: Verwenden Sie den Befehl `` `popen```, um die Python-Verarbeitungsergebnisse in Echtzeit in PHP abzurufen.
result.php
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="en">
<head>
<title>Progress Bar</title>
</head>
<body>
<!-- Progress bar holder -->
<div id="progress" style="width:500px;border:1px solid #ccc;"></div>
<!-- Progress information -->
<div id="information" style="width"></div>
<?php
$isbn = $_POST['isbn'];
echo "ISBN: ".$isbn;
// Total processes
$total = 10;
// Loop through process
$cmd = "python /var/www/html/service/progressbar/process.py ".$isbn;
$proc = popen($cmd, 'r');
//rea one line of the last oparation, and do nothing
$i = (int) fread($proc, 4096);
while (!feof($proc)) {
// Calculate the percentation
$i = (int) fread($proc, 4096);
$percent = intval($i/$total * 100)."%";
// Javascript for updating the progress bar and information
echo '<script language="javascript">
document.getElementById("progress").innerHTML="<div style=\"width:'.$percent.';background-color:#ddd;\"> </div>";
document.getElementById("information").innerHTML="'.$percent.' processed.";
</script>';
// Send output to browser immediately
flush();
// Sleep one second so we can see the delay
sleep(1);
if($percent=="100%")
break;
}
// Tell user that the process is completed
echo '<script language="javascript">
document.getElementById("information").innerHTML="Process completed!";
</script>';
//send mail when the process is over
$to = "[email protected]";
$subject = "Charge verarbeitet";
$message = "Administrator,\n Artikelnummer: 「".$isbn."Es wurde verarbeitet.\n Danke.";
$headers = 'From: [email protected]' . "\r\n";
if(mail($to, $subject, $message, $headers))
echo "Benachrichtigungsmail wurde gesendet!";
else
echo "Die Benachrichtigungs-E-Mail konnte nicht gesendet werden.\n Bitte informieren Sie den Administrator direkt über die Artikelnummer."
?>
</body>
</html>
Der Quellcode für dieses Programm kann auch über den folgenden Link abgerufen werden. Implementierung des Fortschrittsbalkens
Recommended Posts