Le titre peut être suspect et difficile à comprendre, mais en termes simples, il s'agit d'une implémentation d'une fonction qui affiche la progression du traitement par lots effectué côté serveur en temps réel sous la forme d'une barre de progression. En ce qui concerne la méthode, il semble qu'il existe différentes méthodes, mais parmi elles, il n'y avait pas de méthode d'implémentation comme moi cette fois, donc je la posterai pour le moment.
--Browser: ** Entrée de paramètre ** (Langue: php) --Serveur:
Cette fois, j'avais besoin de saisir l'ISBN du produit, alors saisissez le numéro ISBN et envoyez-le au serveur sous forme de courrier.
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>
Côté serveur, selon les paramètres obtenus du côté navigateur, il est nécessaire d'effectuer un traitement par lots et en même temps d'exécuter un script de surveillance pour appréhender la situation. Par conséquent, deux scripts, le traitement par lots et la surveillance, seront lancés en parallèle.
Remarque: Lorsque le traitement par lots est terminé, afin de mettre fin au script de surveillance, l'état du traitement par lots est notifié en transmettant l'ID du processus de traitement par lots au script de surveillance.
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]
#Partie de traitement par lots
mainJob = Process(target=f, args=("",q,"test", isbn, ))
jobs.append(mainJob)
mainJob.start()
logPID = str(q.get()[0])
#Partie surveillance
monitorJob = Process(target=f, args=(logPID,q,"monitor", "", ))
jobs.append(monitorJob)
monitorJob.start()
for job in jobs:
job.join()
main()
À l'origine, le but de ce programme est d'effectuer un traitement par lots basé sur les informations ISBN, mais cette fois, en tant que cas de test, nous le remplacerons par un script qui affiche la progression du traitement sous forme de valeur numérique à intervalles de temps réguliers.
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
Le script de surveillance utilise la commande `` tail '' pour récupérer et analyser les lignes ajoutées au fichier journal en temps réel. Cette fois, puisque l'état d'avancement est directement sorti sous forme de nombre dans le traitement par lots, aucun traitement n'est effectué, mais en réalité, puisque diverses informations sont mélangées dans le fichier journal ainsi que l'état d'avancement, seul l'état d'avancement est utilisé dans le script de surveillance. Un traitement pour extraire est nécessaire.
Remarque: en ajoutant l'ID du processus de traitement par lots à la commande `` tail '', il est possible de mettre fin au script de surveillance lorsque le traitement par lots est terminé.
monitor.sh
#!/bin/sh
pID=$1 #ID du processus de traitement par lots
tail -f -n 1 --pid=$pID log.txt | while read line
do
if [ -n "$line" ] ; then
echo $line
fi
done
Acquiert les résultats de surveillance en temps réel et les affiche sur la barre de progression. Enfin, nous informerons l'administrateur par e-mail qu'il a été traité.
Remarque: utilisez la commande `` popen '' pour obtenir les résultats du traitement python en temps réel en php.
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 = "Lot traité";
$message = "Administrateur,\n Numéro d'article: 「".$isbn."Il a été traité.\n Merci.";
$headers = 'From: [email protected]' . "\r\n";
if(mail($to, $subject, $message, $headers))
echo "Un e-mail de notification a été envoyé!";
else
echo "L'e-mail de notification n'a pas pu être envoyé.\n Veuillez informer directement l'administrateur du numéro d'article."
?>
</body>
</html>
Le code source de ce programme peut également être obtenu à partir du lien ci-dessous. Implémentation de la barre de progression