web-dev-qa-db-fra.com

Quelle est la manière canonique de déterminer l'exécution en ligne de commande par rapport à 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 sortie. Quelle est la manière canonique de procéder? Je l'avais pensé était d'inspecter SERVER['argc'], mais il s'avère que cela est rempli, même lorsque vous utilisez l'API du serveur 'Apache 2.0 Handler'.

153
Bobby Jack

Utilisez la fonction php_sapi_name() .

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

Voici quelques notes pertinentes de la documentation:

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

Bien qu'elles ne soient pas exhaustives, les valeurs de retour possibles incluent aolserver, Apache, Apache2filter, Apache2handler, caudium, cgi (jusqu'à PHP 5.3), cgi-fcgi, cli, cli-server, continuité, embed, isapi , litespeed, milter, nsapi, phttpd, pi3web, roxen, thttpd, Tux et webjames.

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

222
user3850

Cela fonctionnera toujours. (Si la version PHP version 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');
22
Xeoncross

Voici Drupal 7 implémentation: 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'

9
ya.teck

Je pense

$_SERVER['REMOTE_ADDR']

ne sera pas rempli à partir de la CLI.

De plus, toutes les clés HTTP_ * dans le superglobal $ _SERVER ne seront pas remplies à partir de la CLI, ou faites-le de la bonne façon, comme nous venons de le mentionner :-)

8
Vinko Vrsalovic

La page de documentation de php_sapi_ nom indique clairement comment cela fonctionne:

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

Bien qu'elles ne soient pas exhaustives, les valeurs de retour possibles incluent aolserver, Apache, Apache2filter, Apache2handler, caudium, cgi (jusqu'à PHP 5.3), cgi-fcgi, cli, continuité, 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 auditer tous les serveurs Web possibles sur lesquels PHP peut s'exécuter et déterminer les noms de tous les types d'interface possibles pour chaque serveur. Assurez-vous simplement de conserver cette liste est mise à jour à mesure que de nouveaux serveurs Web et interfaces sont ajoutés.

En outre, Bobby a déclaré:

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

La description de l'exemple indique:

Cet exemple vérifie la sous-chaîne cgi car il peut également s'agir de cgi-fcgi.

4
Steve