soporta - PHP: ¿cómo determinar mejor si la invocación actual proviene de CLI o servidor web?
servidores compatibles con php (16)
Basado en la respuesta de Silver Moon anterior , estoy usando esta función para devolver linebreaks correctos:
/**
* 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>";
}
Necesito determinar si la invocación actual de PHP es desde la línea de comando (CLI) o desde el servidor web (en mi caso, Apache con mod_php).
¿Algún método recomendado?
Creo que quiere decir si PHP CLI está siendo invocado o si es una respuesta de una solicitud web. La mejor forma sería usar php_sapi_name()
que, si ejecutara una solicitud web, haría eco de Apache si eso es lo que estaba ejecutando.
Para enumerar algunos de los documentos php en php_sapi_name()
:
- aolserver
- apache
- apache2filter
- apache2handler
- caudium
- cgi (hasta PHP 5.3)
- cgi-fcgi
- Cli
- cli-server (servidor web incorporado a partir de PHP 5.4)
- continuidad
- empotrar
- fpm-fcgi
- Isapi
- litespeed
- milter
- nsapi
- phttpd
- pi3web
- Roxen
- thttpd
- tux
- webjames
De acuerdo con http://jp2.php.net/manual/en/features.commandline.php Hay una serie de constantes establecidas solo cuando se ejecuta desde la CLI. Estas constantes son STDIN, STDOUT y STDERR. La prueba de uno de ellos le dirá si está en modo cli
Esto debería manejar todos los casos (incluido php-cgi)
return (php_sapi_name() === ''cli'' OR defined(''STDIN''));
He estado usando esta función por algunos años
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;
}
Déjame saber lo que piensas
Lo intentaría:
echo exec(''whoami'');
Por lo general, los servidores web se ejecutan bajo un nombre de usuario diferente, por lo que debería ser revelador.
Mi método preferido:
if (array_key_exists(''SHELL'', $_ENV)) {
echo "Console invocation";
}
else {
echo "HTTP invocation";
}
Sugiero que compruebe si algunas de las entradas de la matriz $_SERVER están configuradas.
P.ej:
if (isset($_SERVER[''REQUEST_METHOD''])) {
print "HTTP request/n";
} else {
print "CLI invocation/n";
}
Tratar
isset($_SERVER[''REQUEST_METHOD''])
si está configurado, estás en un navegador.
Alternativamente, podría verificar si
isset($_SERVER[''argv''])
pero eso podría no ser cierto en Windows CLI, IDK.
Una manera fácil es interrogar a la variable $argv
, (que probablemente hará para los parámetros de la línea de comandos de todos modos). Incluso si no hay parámetros, $argv
devuelve una matriz vacía.
Si está configurado, entonces se usó cli. Entonces puede asumir que todas las demás invocaciones se realizan a través de un servidor web u otro.
p.ej:
if (isset($argv)) {
// Do the cli thing.
}
Usé esto:
php_sapi_name() == ''cli'' || (is_numeric($_SERVER[''argc'']) && $_SERVER[''argc''] > 0)
Esto es de la base de código de Drush, environment.inc donde tienen que hacer una comprobación similar.
camino de joomla
if (array_key_exists(''REQUEST_METHOD'', $_SERVER)) die();
php_sapi_name()
realmente no es la mejor manera de realizar esta verificación porque depende de verificar contra muchos valores posibles. El binario php-cgi se puede llamar desde la línea de comandos, desde un script de shell o como un trabajo cron y (en la mayoría de los casos) también se deben tratar como ''cli'', pero php_sapi_name()
devolverá diferentes valores para estos (tenga en cuenta este no es el caso con la versión simple de PHP pero quiere que su código funcione en cualquier lugar, ¿no?). Sin mencionar que el próximo año puede haber nuevas formas de usar PHP que posiblemente no podamos saber ahora. Prefiero no pensar en eso cuando todo lo que me preocupa es el clima. Debo incluir mi salida en HTML o no.
Afortunadamente, PHP tiene una forma de verificar esto específicamente. Simplemente use http_response_code()
sin ningún parámetro y devolverá TRUE si se ejecutó desde un entorno de tipo servidor web y FALSE si se ejecutó desde un entorno de tipo CLI. Aquí está el código:
$is_web=http_response_code()!==FALSE;
Esto incluso funcionará si accidentalmente (?) Establece un código de respuesta de una secuencia de comandos que se ejecuta desde la CLI (o algo así como la CLI) antes de llamar a esto.
php_sapi_name
es la función que deseará utilizar, ya que devuelve una cadena en minúscula del tipo de interfaz. Además, existe la constante de PHP PHP_SAPI
.
La documentación se puede encontrar aquí: http://php.net/php_sapi_name
Por ejemplo, para determinar si PHP se está ejecutando desde la CLI, puede usar esta función:
function isCommandLineInterface()
{
return (php_sapi_name() === ''cli'');
}
// Detect CLI calls
define("IS_CLI_CALL",( strcmp(php_sapi_name(),''cli'') == 0 ));
if(IS_CLI_CALL){
//do you stuff here
}
function is_cli() {
return !http_response_code();
}
ejemplo:
if (is_cli()) {
echo ''command line'';
} else {
echo ''browser'';
}