60 votes

Comment distinguer l'invocation de la ligne de commande et du serveur web ?

Existe-t-il un moyen de distinguer si un script a été invoqué depuis la ligne de commande ou par le serveur web ?

( Voir Quelle est la manière canonique de déterminer l'exécution en ligne de commande ou en http d'un script PHP ? pour une meilleure réponse et une discussion plus détaillée - je ne l'ai pas trouvée avant de la poster)


J'ai un serveur (non productif) avec Apache 2.2.10 et PHP 5.2.6. Sur celui-ci, dans un répertoire accessible par le web se trouve mon script PHP, maintenance_tasks.php . Je voudrais invoquer ce script à partir de la ligne de commande ou par une requête HTTP (en l'ouvrant dans un navigateur). Existe-t-il une variable qui me permette de déterminer de manière fiable comment le script est invoqué ?

(J'ai déjà abordé les questions des vues différentes pour chaque type d'invocation et du délai de réponse HTTP, je cherche simplement un moyen de distinguer les deux types d'invocation).

Je vais essayer différentes choses et ajouter mes résultats ci-dessous.

Duplicata : Quelle est la manière canonique de déterminer l'exécution en ligne de commande ou en http d'un script PHP ?

98voto

Shocker Points 851

Si elle est appelée à partir de la ligne de commande, la variable serveur HTTP_USER_AGENT n'est pas définie. J'utilise cette constante pour définir, si le script est appelé depuis la ligne de commande ou non :

define("CLI", !isset($_SERVER['HTTP_USER_AGENT']));

UPDATE : Puisque cette réponse est toujours considérée comme "correcte", j'aimerais réviser ma déclaration : se fier à l'en-tête "User-Agent" peut être problématique, car il s'agit d'une valeur définie par l'utilisateur.

Veuillez utiliser php_sapi_name() == 'cli' o PHP_SAPI == 'cli' comme l'a suggéré Eugene/cam8001 dans les commentaires.

Merci de nous le signaler !

3voto

Piskvor Points 46986

J'ai comparé les $_SERVER superglobal dans les deux invocations. Il semble que $_SERVER['argc'] (c'est-à-dire le nombre d'arguments passés au script) n'est défini que lors d'une exécution depuis un shell/une ligne de commande :

<?php
if (isset($_SERVER['argc'])) {
    define('CLI', true);
} else {
    define('CLI', false);
}

Cela semble fonctionner à la fois sur les hôtes Linux et Windows. (J'ai d'abord pensé à vérifier certaines des variables d'environnement, mais celles-ci sont différentes pour chaque système d'exploitation. De plus, toutes les $_SERVER['HTTP_*'] sont manquants dans la version CLI, mais je ne suis pas sûr que ce soit suffisamment fiable).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X