web-dev-qa-db-fra.com

Comment distinguer l'appel de ligne de commande et de serveur Web?

Existe-t-il un moyen de distinguer si un script a été appelé à partir de 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 vs http d'un script PHP? pour la meilleure réponse et discussion plus détaillée - je n'en ai pas trouvé avant de poster)


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

(J'ai déjà abordé les problèmes de vues différentes pour chaque type d'invocation et de délai de réponse HTTP, en cherchant simplement un moyen de distinguer les deux types d'invocation)

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

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

60
Piskvor

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']));

PDATE: Étant donné que cette réponse est toujours marquée comme "correcte", je voudrais réviser ma déclaration - le fait de se fier à l'en-tête "User-Agent" peut être problématique, car c'est une définition définie par l'utilisateur valeur.

Veuillez utiliser php_sapi_name() == 'cli' ou PHP_SAPI == 'cli', Comme suggéré par Eugene/cam8001 dans les commentaires.

Merci de l'avoir signalé!

98
Shocker

J'ai comparé le $_SERVER superglobal dans les deux invocations. Il paraît que $_SERVER['argc'] (c'est-à-dire le nombre d'arguments transmis au script) n'est défini que lors de l'exécution à partir de Shell/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_*'] les en-têtes sont manquants dans la version CLI, mais je ne suis pas sûr que ce soit assez fiable.)

3
Piskvor