Maison >développement back-end >tutoriel php >Comment puis-je obtenir une sortie en temps réel des commandes Shell en PHP ?

Comment puis-je obtenir une sortie en temps réel des commandes Shell en PHP ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-03 20:03:16341parcourir

How Can I Get Real-Time Output from Shell Commands in PHP?

Sortie en temps réel avec l'exécution du shell de PHP

L'exécution du shell en PHP, à l'aide de fonctions telles que shell_exec et exec, peut être bénéfique pour interagir avec le système d’exploitation. Cependant, par défaut, ces fonctions affichent l'intégralité de la sortie uniquement une fois la commande terminée. Cela limite la possibilité de surveiller les progrès ou d'afficher les mises à jour en temps réel.

Solution : libérer la sortie en direct

Pour obtenir un affichage de sortie en temps réel, PHP propose deux principaux options :

  1. popen() pour Parallèle Interaction :

    popen() vous permet d'établir un canal de communication bidirectionnel avec un processus enfant. Cela vous permet de lire et d'écrire sur le processus enfant comme s'il s'agissait d'un fichier. En utilisant une boucle et fread(), vous pouvez capturer la sortie et l'afficher de manière dynamique.

  2. passthru() pour la sortie directe :

    Pour une approche plus simple, passthru() peut être utilisé pour imprimer directement le résultat d'une commande sur le navigateur. Il fournit un moyen pratique de diffuser les résultats sans stockage intermédiaire.

Exemple de code utilisant popen() :

// Ensure flushing of output buffers
while (@ ob_end_flush());

// Open the child process for reading
$proc = popen($cmd, 'r');

echo '<pre class="brush:php;toolbar:false">';

// Keep reading and displaying output until EOF
while (!feof($proc)) {
    echo fread($proc, 4096);
    flush();
}

echo '
'; // Close the process pclose($proc);

Remarque :

  • Utilisez session_write_close() avant la boucle si les sessions sont actives pour éviter de bloquer les sessions simultanées requêtes.
  • Définissez l'en-tête header('X-Accel-Buffering: no'); si une Nginxgateway est présente pour désactiver la mise 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!

Déclaration:
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