Position actuelle: Accueil> Derniers articles> Quelle est la différence entre les fonctions shell_exec et exec? Analyse de leurs scénarios et avantages et inconvénients applicables dans PHP

Quelle est la différence entre les fonctions shell_exec et exec? Analyse de leurs scénarios et avantages et inconvénients applicables dans PHP

gitbox 2025-09-16

Dans PHP, les fonctions Shell_exec et Exec sont utilisées pour exécuter des commandes ou des scripts externes, mais ils ont des différences importantes dans le traitement de sortie et le comportement d'exécution. Comprendre les scénarios d'utilisation et les avantages et les inconvénients de ces deux fonctions est très important pour l'écriture de code efficace et sûr. Cet article analysera en détail les différences entre ces deux fonctions, ainsi que leurs scénarios et avantages et inconvénients applicables dans les applications réelles.

1. Concepts de base

  • shell_exec :
    La fonction shell_exec est utilisée pour exécuter des commandes externes et renvoyer la sortie complète. Cette fonction renvoie la sortie standard de la commande (stdout) en tant que chaîne. Si la commande ne parvient pas à s'exécuter ou qu'il n'y a pas de sortie, elle renvoie NULL .

    Exemple:

     <span><span><span class="hljs-variable">$output</span></span><span> = </span><span><span class="hljs-title function_ invoke__">shell_exec</span></span><span>(</span><span><span class="hljs-string">'ls -l'</span></span><span>);
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$output</span></span><span>;
    </span></span>
  • exec :
    La fonction EXEC exécute des commandes externes et renvoie le résultat d'exécution. Contrairement à Shell_exec , la fonction EXEC peut renvoyer la sortie d'une commande en tant que tableau et peut renvoyer la dernière ligne de la sortie de commande, qui est généralement utilisée pour traiter l'état d'exécution de la commande.

    Exemple:

     <span><span><span class="hljs-variable">$output</span></span><span> = [];
    </span><span><span class="hljs-variable">$return_var</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>;
    </span><span><span class="hljs-title function_ invoke__">exec</span></span><span>(</span><span><span class="hljs-string">'ls -l'</span></span><span>, </span><span><span class="hljs-variable">$output</span></span><span>, </span><span><span class="hljs-variable">$return_var</span></span><span>);
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">implode</span></span><span>(</span><span><span class="hljs-string">"\n"</span></span><span>, </span><span><span class="hljs-variable">$output</span></span><span>);
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$return_var</span></span><span>; </span><span><span class="hljs-comment">// Le code d&#39;état de retour de la commande</span></span><span>
    </span></span>

2. Traitement de sortie

  • shell_exec :
    shell_exec renvoie la sortie standard de la commande entière en tant que chaîne. Étant donné que toute la sortie est renvoyée, elle convient aux cas où les résultats de la commande doivent être traités ou sortis. Cependant, il ne renvoie pas de message d'erreur, et si l'exécution de la commande échoue, le code d'erreur ne peut pas être obtenu directement.

    Exemple:

     <span><span><span class="hljs-variable">$output</span></span><span> = </span><span><span class="hljs-title function_ invoke__">shell_exec</span></span><span>(</span><span><span class="hljs-string">'cat non_existing_file'</span></span><span>);
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$output</span></span><span> === </span><span><span class="hljs-literal">null</span></span><span>) {
        </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Command failed."</span></span><span>;
    }
    </span></span>
  • exec :
    EXEC permet de retourner la sortie standard en tant que tableau et la sortie de commande peut être traitée davantage. De plus, EXEC renvoie le code d'état de sortie de la commande, ce qui est très utile pour déterminer si la commande est exécutée avec succès. Exec fournit un contrôle plus fort, adapté au traitement granulaire plus fin de l'état et aux résultats de l'exécution des commandes.

    Exemple:

     <span><span><span class="hljs-variable">$output</span></span><span> = [];
    </span><span><span class="hljs-title function_ invoke__">exec</span></span><span>(</span><span><span class="hljs-string">'ls non_existing_directory'</span></span><span>, </span><span><span class="hljs-variable">$output</span></span><span>, </span><span><span class="hljs-variable">$status_code</span></span><span>);
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$status_code</span></span><span> !== </span><span><span class="hljs-number">0</span></span><span>) {
        </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Command failed with status code: <span class="hljs-subst">$status_code</span></span></span><span>";
    }
    </span></span>

3. Sécurité

Bien que Exec et Shell_EXEC puissent exécuter des commandes externes, elles posent des risques de sécurité potentiels, en particulier lors du traitement de l'entrée de l'utilisateur. Toute entrée utilisateur non filtrée peut entraîner des vulnérabilités d'injection de commandes lors de l'exécution de commandes externes.

  • Empêcher l'injection de commande :
    Lorsque vous utilisez ces deux fonctions, vous devez faire particulièrement attention à l'entrée de l'utilisateur. Il est préférable d'utiliser EscapeshelLarg et EscapeshellCMD pour échapper à la saisie des utilisateurs pour s'assurer que la commande n'est pas exploitée par un code malveillant lors de l'exécution.

    Exemple:

     <span><span><span class="hljs-variable">$user_input</span></span><span> = </span><span><span class="hljs-title function_ invoke__">escapeshellarg</span></span><span>(</span><span><span class="hljs-variable">$user_input</span></span><span>);
    </span><span><span class="hljs-variable">$output</span></span><span> = </span><span><span class="hljs-title function_ invoke__">shell_exec</span></span><span>(</span><span><span class="hljs-string">"grep <span class="hljs-subst">$user_input</span></span></span><span> file.txt");
    </span></span>

4. Performance

En termes de performances, la différence entre Shell_EXEC et EXEC n'est pas très grande, mais une chose à noter est que l'exécutif peut traiter de manière plus flexible de grandes quantités de données de sortie car elle peut renvoyer la sortie par ligne. Le shell_exec renvoie toute la chaîne de sortie, qui peut consommer plus de mémoire lors du traitement des mégadonnées.

5. Scénarios applicables

  • shell_exec :

    • Convient pour les scénarios où la sortie de la commande entière doit être prise et renvoyée sous forme de chaîne.

    • Lorsque vous ne vous souciez que du résultat de la commande, mais pas de la sortie de chaque ligne ou du code d'état de la commande, vous pouvez choisir Shell_exec .

    • Exemple de scénario: obtenez la sortie complète d'un script ou d'une commande, tels que le téléchargement du contenu Web à partir de Curl .

  • exec :

    • Convient pour les scénarios où la sortie de la commande doit être traitée ligne par ligne ou doit obtenir le code d'état de sortie de la commande.

    • Exec est plus approprié lorsque vous devez effectuer d'autres opérations sur la sortie de commande, telles que la vérification d'une sortie spécifique ou la comparaison de plusieurs sorties de commande.

    • Exemple de scénario: exécutez une séquence complexe de commandes ou une opération qui nécessite le renvoi des codes d'état d'exécution.

6. Résumé et analyse des avantages et des inconvénients

fonction avantage défaut Scénarios applicables
shell_exec Renvoie toute la sortie de la commande en tant que chaîne, simple et facile à utiliser Le code d'état de sortie n'est pas renvoyé et la sortie peut consommer plus de mémoire lorsqu'elle est grande. Seulement soin des résultats de la commande, aucune analyse de sortie à grain fin n'est requise
exécutif Prend en charge Renvoi plusieurs lignes de sortie et de code d'état de sortie, plus de flexibilité Il est un peu compliqué à utiliser et nécessite des tableaux de traitement et des codes d'état Besoin d'analyser la sortie de la commande ou le jugement du code du statut de dépendance

En général, Shell_exec et Exec ont leurs propres avantages et inconvénients. Lequel est choisi dépend de vos besoins pour le résultat d'exécution de la commande. Si vous vous souciez uniquement de la sortie complète de la commande, vous pouvez utiliser shell_exec ; Si vous avez besoin de traiter la sortie ligne par ligne ou de vérifier le code d'état de sortie de la commande, EXEC est un choix plus approprié. Dans le développement réel, il est important de faire attention à la prévention des risques d'injection de commande et de sélectionner les fonctions appropriées en fonction des besoins réels.