2009-06-01 8 views

Respuesta

253

php_sapi_name es la función que se desea usar, ya que devuelve una cadena en minúsculas del tipo de interfaz. Además, existe la constante PHP PHP_SAPI.

documentación se puede encontrar aquí: http://php.net/php_sapi_name

Por ejemplo, para determinar si PHP se ejecuta desde la línea de comandos, se puede usar esta función:

function isCommandLineInterface() 
{ 
    return (php_sapi_name() === 'cli'); 
} 
+9

Más sencillo: 'return php_sapi_name() == 'cli';' – Savageman

+9

Investigué: si invocas el script con 'php-cgi' esto no funcionará. A su vez, devolverá la cadena 'cgi-fcgi'. Si carga la secuencia de comandos como una página web desde un navegador, obtendrá 'apache2handler'. Espero que esto ayude. Necesitaba usar 'php-cgi' para introducir las variables' $ _GET': 'php-cgi myscript.php arg1 = one arg2 = two'. La prueba de no igual a 'apache2handler' debería estar bien para' apache'. – Sebastian

+2

Una pequeña advertencia sobre este método: * no * devolverá '" cli "' cuando se ejecute desde un trabajo cron. Hay un número de diferentes claves para elegir dentro de '$ _SERVER' para determinar de manera más confiable si la solicitud llegó a través de HTTP o no. – omninonsense

-14

que iba a tratar:

echo exec('whoami'); 

Por lo general, los servidores web está operada bajo un nombre de usuario diferente, por lo que debería estar diciendo.

3

Trate

isset($_SERVER['REQUEST_METHOD']) 

si está configurado, estás en un navegador.

Alternatlely, se puede comprobar si

isset($_SERVER['argv']) 

pero que podría no ser cierto en las ventanas de la CLI, IDK.

+1

Aunque no es la respuesta "correcta", podría ser la más confiable – challet

0

Sugeriría verificar si algunas de las entradas de la matriz $_SERVER están configuradas.

ej .:

if (isset($_SERVER['REQUEST_METHOD'])) { 
     print "HTTP request\n"; 
} else { 
     print "CLI invocation\n"; 
} 
+0

Esto no funcionará con la línea de comando 'php-cgi', se establecerá en' GET' para: 'php-cgi -f file.php arg1 = 2' – Sebastian

+0

@Sebastian gracias por la observación –

21

Creo que quiere decir si PHP CLI invocado o si es una respuesta de una solicitud web. La mejor manera sería usar php_sapi_name() que, si se ejecutara, una solicitud web se mostraría en Apache si eso es lo que estaba ejecutando.

Para lista de algunos tomada de la php docs on php_sapi_name():

  • aolserver
  • Apache
  • apache2filter
  • apache2handler
  • Caudium
  • cgi (hasta PHP 5.3)
  • cgi-fcgi
  • cli
  • cli-server (Built-in web server a partir de PHP 5.4)
  • continuidad
  • incrustar
  • FPM-fcgi
  • isapi
  • litespeed
  • milter
  • nsapi
  • phttpd
  • pi3web
  • roxen
  • thttpd
  • esmoquin
  • WebJames
1

Según http://jp2.php.net/manual/en/features.commandline.php Hay una serie de constantes establece sólo cuando se ejecuta desde la línea de comandos. Estas constantes son STDIN, STDOUT y STDERR. Las pruebas para detectar uno de los le dirá si está en el modo CLI

0

Mi método preferido:

if (array_key_exists('SHELL', $_ENV)) { 
    echo "Console invocation"; 
} 
else { 
    echo "HTTP invocation"; 
} 
+0

Esto no funcionará con la línea de comando 'php-cgi'. – Sebastian

3

que utiliza esto:

php_sapi_name() == 'cli' || (is_numeric($_SERVER['argc']) && $_SERVER['argc'] > 0) 

Esto es de Drush código base, donde environment.inc tienen un cheque similar para hacer.

+3

Si se establece 'register_argc_argv', pasar cualquier cantidad de valores GET hará que' argc' no sea 0. –

0
// Detect CLI calls 
define("IS_CLI_CALL",(strcmp(php_sapi_name(),'cli') == 0)); 

if(IS_CLI_CALL){ 
    //do you stuff here 

} 
11

Esto debe manejar todos los casos (incluyendo php-cgi)

return (php_sapi_name() === 'cli' OR defined('STDIN')); 
0

manera Joomla

if (array_key_exists('REQUEST_METHOD', $_SERVER)) die(); 
12

He estado usando esta función durante unos 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

+7

'array_key_exists ('REQUEST_METHOD', $ _SERVER) return true;' WAT? – biziclop

+0

@biziclop, la comprobación de 'array_key_exists ('REQUEST_METHOD', $ _SERVER)' es correcta para ayudar a la detección del _source de la solicitud_. Cuando esté en ** CLI **, la matriz Super Global '$ _SERVER' NO ** TENDRÁ ** la clave' REQUEST_METHOD', solo existe cuando la solicitud se realiza a través de la Web, por lo tanto, el autor está absolutamente en el blanco al verificar para ello. –

+1

@JulioMarchi: pero ¿no debería 'devolver falso;' o hacer 'if (! Array_key_exists (...)) return true;'? – biziclop

0

Una manera fácil es interrogar a la variable , (que probablemente hará para los parámetros de línea de comandos de todos modos). Incluso si no hay parámetros, devuelve una matriz vacía.

Si está configurado, se utilizó cli. Entonces puede asumir que todas las demás invocaciones se realizan a través de un servidor web u otro.

por ejemplo:

if (isset($argv)) { 
    // Do the cli thing. 
} 
9

php_sapi_name() no es realmente la mejor manera de realizar esta comprobación, ya que depende de comprobación con 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) estos también deben tratarse como 'cli', pero php_sapi_name() devolverá valores diferentes para estos (tenga en cuenta que esto no es 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.Solo 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 va a trabajar incluso si accidentalmente se configura un código de respuesta de un guión que va desde la línea de comandos (o algo así como la CLI) antes de llamar a esto (?).

+1

Tienes razón, pero ¿por qué nadie votó por tu respuesta? –

+2

Esta pregunta ya era vieja cuando respondí. Actualizar esta respuesta probablemente hubiera sido más útil que publicar otra respuesta que sea un duplicado, excepto sin la explicación. – krowe2

6
function is_cli() { 
    return !http_response_code(); 
} 

ejemplo:

if (is_cli()) { 
    echo 'command line'; 
} else { 
    echo 'browser'; 
} 
+2

Del manual, se devolverá "FALSE si no se proporciona response_code y no se invoca en un entorno de servidor web (como desde una aplicación CLI). TRUE se devolverá si se proporciona response_code y no se invoca en una web entorno del servidor (pero solo cuando no se haya configurado un estado de respuesta previo) ". Has recuperado tu lógica. – krowe2

+1

+1. Asombroso. Después de tantos años de investigación infructuosa ... Por la presente le otorgo el Premio Nobel Memorial en PHPics, compartido con @ krowe2 por su inestimable contribución de hacer que realmente funcione. ¡Felicitaciones! –

Cuestiones relacionadas