Maison > développement back-end > tutoriel php > Comment puis-je surveiller la sortie en direct des commandes Shell en PHP ?

Comment puis-je surveiller la sortie en direct des commandes Shell en PHP ?

DDD
Libérer: 2024-12-04 07:42:13
original
1068 Les gens l'ont consulté

How Can I Monitor Live Output from Shell Commands in PHP?

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 '
';
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal