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".
Réponses
Trop de publicités?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()
.
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'
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.