Suivre la progression d’une copie en PHP
S’il y a quelque chose qui est d’une complexité monumentale en programmation de sites web, c’est de savoir ce qu’il se passe sur le serveur mais côté client, surtout quand certains processus, comme la copie de lourds fichier par exemple, peut prendre plusieurs minutes.
Cependant, le fichier est copié octet par octet, et le serveur distant ne connait pas la taille finale. Donc on peut exploiter cette information.
Note : les tests ont été effectués sur un serveur Windows, à confirmer sur un Unix.
Ainsi, voici la démarche que j’ai mise en place pour un serveur de sauvegarde :
- Faire un flush() dès le début, pour voir le code s’afficher au fur et à mesure
- créer une page d’appel en Ajax, qui renvoie la taille du fichier en cours de copie, avec en paramètres :
- le nom du fichier
- la taille du fichier initial
- en PHP, avant de faire la copie, ajouter un echo d’un script qui fait un setInterval sur la page Ajax et qui affiche la progression
Exemple :
<script src="jquery.js"></script>
<?php
$src='fichier1.zip';
$dest='fichier2.zip';
$taille=filesize($src);
echo '<span id="pgrs">
<script>
$.get("ajax.php?taille='.$taille.'&dest='.urlencode($dest).'")
.done(function(data) {
var pc=Math.floor(100*data/'.$taille.');
$("#pgrs").html(pc+"%");
</script>';
copy($src, $dest);