Je dois déterminer si l'invocation actuelle de PHP provient de la ligne de commande (CLI) ou du serveur Web (dans mon cas, Apache avec mod_php).
Des méthodes recommandées?
Je dois déterminer si l'invocation actuelle de PHP provient de la ligne de commande (CLI) ou du serveur Web (dans mon cas, Apache avec mod_php).
Des méthodes recommandées?
Réponses:
php_sapi_name
est la fonction que vous souhaiterez utiliser car elle renvoie une chaîne minuscule du type d'interface. De plus, il y a la constante PHP PHP_SAPI
.
La documentation peut être trouvée ici: http://php.net/php_sapi_name
Par exemple, pour déterminer si PHP est exécuté à partir de la CLI, vous pouvez utiliser cette fonction:
function isCommandLineInterface()
{
return (php_sapi_name() === 'cli');
}
return php_sapi_name() == 'cli';
php-cgi
cela ne fonctionnera pas. À son tour, il retournera cgi-fcgi
String. Si vous chargez le script en tant que page Web à partir d'un navigateur, vous obtiendrez apache2handler
. J'espère que cela t'aides. Je avais besoin d'utiliser php-cgi
afin d'introduire des $_GET
variables: php-cgi myscript.php arg1=one arg2=two
. Tester une valeur différente de apache2handler
devrait être acceptable apache
.
"cli"
lorsqu'elle est exécutée à partir d'une tâche cron. Il y a un certain nombre de clés différentes parmi lesquelles choisir $_SERVER
pour déterminer de manière plus fiable si la demande est venue via HTTP ou non.
J'utilise cette fonction depuis quelques années
function is_cli()
{
if ( defined('STDIN') )
{
return true;
}
if ( php_sapi_name() === 'cli' )
{
return true;
}
if ( array_key_exists('SHELL', $_ENV) ) {
return true;
}
if ( empty($_SERVER['REMOTE_ADDR']) and !isset($_SERVER['HTTP_USER_AGENT']) and count($_SERVER['argv']) > 0)
{
return true;
}
if ( !array_key_exists('REQUEST_METHOD', $_SERVER) )
{
return true;
}
return false;
}
array_key_exists('REQUEST_METHOD', $_SERVER) return true;
WAT?
array_key_exists('REQUEST_METHOD', $_SERVER)
est correcte pour aider à la détection de la source de la requête . En CLI , le $_SERVER
tableau Super Global N'AURA PAS la clé REQUEST_METHOD
, elle n'existe que lorsque la demande est faite via le Web, par conséquent, l'auteur est absolument sur la cible lors de la vérification.
return false;
ou faire if ( ! array_key_exists(…)) return true;
?
'REQUEST_METHOD'
n'est PAS trouvée, alors la fonction devrait revenir FALSE
pour indiquer "CLI". Mes excuses pour ne pas avoir fait attention à la portée de la fonction elle-même ... L'auteur devrait le corriger car la fonction fonctionne réellement!
php_sapi_name()
n'est vraiment pas la meilleure façon d'effectuer cette vérification car elle dépend de la vérification par rapport à de nombreuses valeurs possibles. Le binaire php-cgi peut être appelé à partir de la ligne de commande, à partir d'un script shell ou en tant que tâche cron et (dans la plupart des cas) ceux-ci doivent également être traités comme 'cli' mais renverront des php_sapi_name()
valeurs différentes pour ceux-ci (notez que ce n'est pas t le cas avec la version simple de PHP mais vous voulez que votre code fonctionne n'importe où, non?). Sans oublier que l'année prochaine, il pourrait y avoir de nouvelles façons d'utiliser PHP que nous ne pouvons probablement pas connaître maintenant. Je préfère ne pas y penser quand je ne me soucie que de la météo, je devrais encapsuler ma sortie en HTML ou non.
Heureusement, PHP a un moyen de vérifier cela spécifiquement. Utilisez simplement http_response_code()
sans aucun paramètre et il retournera TRUE s'il est exécuté à partir d'un environnement de type serveur Web et FALSE s'il est exécuté à partir d'un environnement de type CLI. Voici le code:
$is_web=http_response_code()!==FALSE;
Cela fonctionnera même si vous définissez accidentellement (?) Un code de réponse à partir d'un script s'exécutant à partir de la CLI (ou quelque chose comme la CLI) avant d'appeler cela.
http_response_code()
définit le code / renvoie le code défini lors de l'exécution à partir de la CLI. Vérifié par <?php function t() { echo var_export(http_response_code(), true) . ' -> ' . (http_response_code() !== false ? 'web' : 'cli') . "\n"; } t(); http_response_code(200); t(); http_response_code(false); t();
. Donc, si http_response_code()===false
alors c'est une valeur sûre d'assumer la CLI, mais sinon vous devez vérifier également d'autres métriques.
Je pense qu'il veut dire si PHP CLI est invoqué ou s'il s'agit d'une réponse à une requête Web. Le meilleur moyen serait d'utiliser php_sapi_name()
ce qui, s'il exécutait une requête Web, ferait écho à Apache si c'est ce qu'il exécutait.
Pour lister quelques extraits de la documentationphp_sapi_name()
php sur :
function is_cli() {
return !http_response_code();
}
exemple:
if (is_cli()) {
echo 'command line';
} else {
echo 'browser';
}
http_response_code(200);
... si je l'appelle maintenant, http_response_code()
il renvoie 200;
http_response_code();
est appelé à partir d'un environnement CLI, il retournera toujours FALSE quel que soit le code d'état réel. Je l'ai déjà expliqué dans ma réponse, mais vous auriez pu également le découvrir en lisant la page de manuel sous "Valeurs de retour" ou en l'essayant.
php -r 'http_response_code(200); echo http_response_code()."\n";'
"200" Sauf si vous pouvez garantir qu'une bibliothèque ou un framework ignorant n'a pas défini le code de réponse avec http_response_code
(même dans un environnement cli), alors cela fonctionnera. Personnellement, j'utilise$isCli = \defined('STDIN') || isset($_SERVER['argv']) || \array_key_exists('REQUEST_METHOD', $_SERVER)
J'ai utilisé ceci:
php_sapi_name() == 'cli' || (is_numeric($_SERVER['argc']) && $_SERVER['argc'] > 0)
Cela vient de Drush codebase, environment.inc où ils ont une vérification similaire à faire.
Essayer
isset($_SERVER['REQUEST_METHOD'])
s'il est défini, vous êtes dans un navigateur.
Alternativement, vous pouvez vérifier si
isset($_SERVER['argv'])
mais cela pourrait ne pas être vrai sur Windows CLI, IDK.
Selon http://jp2.php.net/manual/en/features.commandline.php Il existe un certain nombre de constantes définies uniquement lors de l'exécution à partir de la CLI. Ces constantes sont STDIN, STDOUT et STDERR. Tester l'un de ceux-ci vous dira s'il est en mode cli
Je suggérerais de vérifier si certaines des entrées du tableau $ _SERVER sont définies.
Par exemple:
if (isset($_SERVER['REQUEST_METHOD'])) {
print "HTTP request\n";
} else {
print "CLI invocation\n";
}
php-cgi
ligne de commande, il le définira sur GET
pour:php-cgi -f file.php arg1=2
Ma méthode préférée:
if (array_key_exists('SHELL', $_ENV)) {
echo "Console invocation";
}
else {
echo "HTTP invocation";
}
// Detect CLI calls
define("IS_CLI_CALL",( strcmp(php_sapi_name(),'cli') == 0 ));
if(IS_CLI_CALL){
//do you stuff here
}
Un moyen simple est d'interroger la $argv
variable, (ce que vous ferez probablement pour les paramètres de ligne de commande de toute façon). Même s'il n'y a pas de paramètres $argv
renvoie un tableau vide.
S'il est défini, alors cli a été utilisé. Vous pouvez alors supposer que toutes les autres invocations se font via un serveur Web ou autre.
par exemple:
if (isset($argv)) {
// Do the cli thing.
}
Sur la base de la réponse de Silver Moon ci - dessus , j'utilise cette fonction pour renvoyer les sauts de ligne corrects:
/**
* Linebreak function
* @return "/n" if cli, else return <br>
*/
protected static function lb(){
return (defined('STDIN') || php_sapi_name() === 'cli' || isset($_ENV['SHELL']) ||
(empty($_SERVER['REMOTE_ADDR']) && !isset($_SERVER['HTTP_USER_AGENT']) && count($_SERVER['argv']) > 0) ||
!isset($_SERVER['REQUEST_METHOD'])) ? "\n" : "<br>";
}
La bonne réponse à cette question dépend de l'intention réelle qui la sous-tend:
Si le premier les réponses données et les commentaires écrits suffisent pour trouver une solution qui fonctionne.
Dans ce dernier cas, les recettes données ici échoueront si l'outil est exécuté en tant que cronjob, ou en tant que travail d'arrière-plan d'un autre démon - dans ce cas, je suggère de tester davantage s'il STDIN
s'agit d'un TTY:
function at_tty() {
return defined("\STDIN") && posix_isatty(\STDIN);
}
J'essaierais:
echo exec('whoami');
Habituellement, les serveurs Web sont exécutés sous un nom d'utilisateur différent, donc cela devrait être révélateur.