154 votes

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

J'ai un script PHP qui doit déterminer s'il a été exécuté via la ligne de commande ou via HTTP, principalement à des fins de formatage de la sortie. Quelle est la façon canonique de faire cela ? Je pensais qu'il fallait inspecter SERVER['argc'] mais il s'avère qu'elle est remplie, même en utilisant l'API de serveur "Apache 2.0 Handler".

225voto

hop Points 15423

Utilisez le php_sapi_name() fonction.

if (php_sapi_name() == "cli") {
    // In cli-mode
} else {
    // Not in cli-mode
}

Voici quelques notes pertinentes tirées de la documentation :

php_sapi_name - Retourne le type d'interface entre le serveur web et PHP.

Sans être exhaustif, les valeurs de retour possibles incluent aolserver, apache, apache2filter, apache2handler, caudium, cgi (jusqu'à PHP 5.3), cgi-fcgi, cli, cli-server, continuity, embed, isapi, litespeed, milter, nsapi, phttpd, pi3web, roxen, thttpd, tux, et webjames.

En PHP >= 4.2.0, il existe également une constante prédéfinie, PHP_SAPI qui a la même valeur que php_sapi_name() .

22voto

Xeoncross Points 13263

Cela fonctionnera toujours. (Si la version de PHP est 4.2.0 ou supérieure)

define('CLI', PHP_SAPI === 'cli');

Ce qui le rend facile à utiliser en haut de vos scripts :

<?php PHP_SAPI === 'cli' or die('not allowed');

9voto

ya.teck Points 258

Voici l'implémentation de Drupal 7 : drupal_is_cli() :

function drupal_is_cli() {
  return (!isset($_SERVER['SERVER_SOFTWARE']) && (php_sapi_name() == 'cli' || (is_numeric($_SERVER['argc']) && $_SERVER['argc'] > 0)));
}

Cependant, Drupal 8 recommande en utilisant PHP_SAPI === 'cli'

8voto

Vinko Vrsalovic Points 116138

Je pense

$_SERVER['REMOTE_ADDR']

ne seront pas remplis à partir de l'interface CLI.

De plus, toutes les clés HTTP_* dans la superglobale $_SERVER ne seront pas remplies à partir du CLI, ou alors faites-le de la bonne manière que nous venons de mentionner :-).

4voto

Steve Points 31

La page de documentation de php_sapi Le nom indique clairement comment il fonctionne :

Renvoie une chaîne de caractères minuscules qui décrit le type d'interface (l'API serveur, SAPI) que PHP utilise.....

Sans être exhaustif, les valeurs de retour possibles incluent aolserver, apache, apache2filter, apache2handler, caudium, cgi (jusqu'à PHP 5.3), cgi-fcgi, cli, continuity, embed, isapi, litespeed, milter, nsapi, phttpd, pi3web, roxen, thttpd, tux, et webjames.

Je ne sais pas pourquoi Hop ne pense pas que PHP est pour les programmeurs sérieux (je suis un programmeur sérieux, et j'utilise PHP quotidiennement), mais s'il veut aider à clarifier la documentation, il peut peut-être faire un audit de tous les serveurs web possibles sur lesquels PHP peut fonctionner et déterminer les noms de tous les types d'interfaces possibles pour chaque serveur. Assurez-vous de mettre à jour cette liste au fur et à mesure que de nouveaux serveurs web et interfaces sont ajoutés.

Aussi, Bobby a dit :

Je suis intrigué de savoir pourquoi l'exemple de la doc. inspecte les 3 premiers caractères, alors que la description indique que la chaîne doit être exactement "CGI".

La description de l'exemple indique :

Cet exemple vérifie la présence de la sous-chaîne cgi car elle peut aussi être cgi-fcgi.

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