¿Cuál es la forma canónica de determinar la línea de comandos frente a la ejecución http de un script PHP?

StackOverflow https://stackoverflow.com/questions/173851

Pregunta

Tengo un script PHP que necesita determinar si se ha ejecutado a través de la línea de comandos o a través de HTTP, principalmente para propósitos de formato de salida. ¿Cuál es la forma canónica de hacer esto? Pensé que era para inspeccionar SERVER ['argc'] , pero resulta que esto se completa, incluso cuando se usa la API del servidor 'Apache 2.0 Handler'.

¿Fue útil?

Solución

Utilice la función php_sapi_name () .

if (php_sapi_name() == "cli") {
    // In cli-mode
} else {
    // Not in cli-mode
}

Aquí hay algunas notas relevantes de los documentos:

  

php_sapi_name : devuelve el tipo de interfaz entre el servidor web y PHP

     

Aunque no es exhaustivo, los posibles valores de retorno incluyen aolserver, apache, apache2filter, apache2handler, caudium, cgi (hasta PHP 5.3), cgi-fcgi, cli, cli-server, continuidad, incrustar, isapi, litespeed, milter, nsapi , phttpd, pi3web, roxen, thttpd, tux y webjames.

En PHP > = 4.2.0, también hay una constante predefinida, PHP_SAPI , que tiene el mismo valor que php_sapi_name () .

Otros consejos

Esto siempre funcionará. (Si la versión de PHP es 4.2.0 o superior)

define('CLI', PHP_SAPI === 'cli');

Lo que facilita su uso en la parte superior de sus scripts:

<?php PHP_SAPI === 'cli' or die('not allowed');

Aquí está la implementación de Drupal 7: drupal_is_cli () :

function drupal_is_cli() {
  return (!isset(

Aquí está la implementación de Drupal 7: drupal_is_cli () :

<*>

Sin embargo, Drupal 8 recomienda usando PHP_SAPI === 'cli'

SERVER['SERVER_SOFTWARE']) && (php_sapi_name() == 'cli' || (is_numeric(

Aquí está la implementación de Drupal 7: drupal_is_cli () :

<*>

Sin embargo, Drupal 8 recomienda usando PHP_SAPI === 'cli'

SERVER['argc']) &&

Aquí está la implementación de Drupal 7: drupal_is_cli () :

<*>

Sin embargo, Drupal 8 recomienda usando PHP_SAPI === 'cli'

SERVER['argc'] > 0))); }

Sin embargo, Drupal 8 recomienda usando PHP_SAPI === 'cli'

Creo

Creo

<*>

no se completará desde la CLI.

Además, todas las claves HTTP_ * en el superglobal $ _SERVER no se completarán desde la CLI, o hágalo de la manera correcta que acaba de mencionar :-)

SERVER['REMOTE_ADDR']

no se completará desde la CLI.

Además, todas las claves HTTP_ * en el superglobal $ _SERVER no se completarán desde la CLI, o hágalo de la manera correcta que acaba de mencionar :-)

La página de documentación de php_sapi _name indica claramente cómo funciona:

  

Devuelve una cadena en minúscula que describe el tipo de interfaz (la API del servidor, SAPI) que PHP está usando ...

     

Aunque no es exhaustivo, los posibles valores de retorno incluyen aolserver, apache, apache2filter, apache2handler, caudium, cgi (hasta PHP 5.3), cgi-fcgi, cli, continuidad, incrustar, isapi, litespeed, milter, nsapi, phttpd, pi3web , roxen, thttpd, tux y webjames.

No estoy seguro de por qué el salto no cree que PHP sea para programadores serios (soy un programador serio y uso PHP a diario), pero si quiere ayudar a aclarar la documentación, tal vez pueda auditar todo posibles servidores web que PHP puede ejecutar y determinar los nombres de todos los tipos de interfaz posibles para cada servidor. Solo asegúrese de mantener esa lista actualizada a medida que se agregan nuevos servidores web e interfaces.

Además, Bobby dijo:

  

Estoy intrigado en cuanto a por qué el documento. ejemplo inspecciona los primeros 3 caracteres, mientras que la descripción indica que la cadena debe ser exactamente "CGI"

La descripción de los estados de ejemplo:

  

Este ejemplo comprueba la subcadena cgi porque también puede ser cgi-fcgi.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top