Surveillance des sorties en direct avec Shell_exec de PHP
La fonction shell_exec de PHP fournit un moyen pratique d'exécuter des commandes système à partir d'un script PHP. Cependant, par défaut, il renvoie l’intégralité du résultat de la commande uniquement une fois terminée. Cette limitation peut rendre difficile la surveillance de la progression en direct des commandes de longue durée ou interactives.
Pour remédier à cette limitation, PHP propose des options alternatives qui permettent aux programmeurs de lire et d'afficher le résultat de la commande de manière incrémentielle, permettant aux utilisateurs d'observer le statut en direct du processus.
Une de ces approches consiste à utiliser la fonction popen() de PHP. popen() permet à un script d'ouvrir le flux stdout du processus en tant que flux PHP, permettant au développeur d'interagir avec lui comme s'il s'agissait d'un fichier normal. Cela permet de lire la sortie de la commande en temps réel à l'aide de méthodes telles que fread().
Une autre méthode qui simplifie l'affichage de la sortie en direct est la fonction passthru(). Cette fonction génère directement le résultat de la commande dans le tampon de sortie actuel sans le stocker dans une variable. Cette approche est particulièrement utile pour afficher rapidement le résultat d'une commande sans nécessiter de traitement ou de manipulation supplémentaire.
Pour démontrer l'utilisation de popen() pour la surveillance de sortie en direct, considérez le code suivant :
<?php echo '<pre class="brush:php;toolbar:false">'; // Start the ping process $proc = popen('ping -c 10 127.0.0.1', 'r'); // Continuously read the output and display it in real-time while (!feof($proc)) { echo fread($proc, 4096); flush(); } echo '';
Dans cet exemple, popen() est utilisé pour ouvrir le flux stdout de la commande ping et l'attribuer à la variable $proc. Dans une boucle while, la fonction fread() est utilisée pour lire et afficher en continu le résultat de la commande en temps réel. La fonction flush() est appelée pour garantir que la sortie est envoyée directement au navigateur de l'utilisateur sans aucune mise en mémoire tampon. En utilisant popen() et fread(), ce code permet aux développeurs de suivre en direct la progression de la commande ping et d'observer les résultats au fur et à mesure de leur génération.
Il est important de noter que l'utilisation de ces techniques peut interférer avec certains configurations de serveur, telles que les sessions ou la mise en mémoire tampon nginx. Pour résoudre ces problèmes, envisagez d'appeler session_write_close() avant d'entrer dans la boucle de mise en mémoire tampon de sortie ou de définir l'en-tête header('X-Accel-Buffering: no'); pour empêcher nginx de mettre la sortie en mémoire tampon.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!