soportan soporta servidores servidor que instalar con compatibles como comandos cli aplicaciones php

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


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''; }