sintaxis - ¿Cuál es la forma canónica de determinar la línea de comandos frente a la ejecución http de un script PHP?
php</ php (5)
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 fines de formato de salida. ¿Cuál es la forma canónica de hacer esto? Pensé que era para inspeccionar SERVER[''argc'']
, pero resulta que está lleno, incluso cuando se usa la API del servidor ''Apache 2.0 Handler''.
Aquí está la implementación de Drupal 7: drupal_is_cli() :
function drupal_is_cli() {
return (!isset($_SERVER[''SERVER_SOFTWARE'']) && (php_sapi_name() == ''cli'' || (is_numeric($_SERVER[''argc'']) && $_SERVER[''argc''] > 0)));
}
Sin embargo, Drupal 8 recommends usar PHP_SAPI === ''cli''
Esto siempre funcionará (Si la versión de PHP es 4.2.0 o superior)
define(''CLI'', PHP_SAPI === ''cli'');
Lo que hace que sea fácil de usar en la parte superior de tus scripts:
<?php PHP_SAPI === ''cli'' or die(''not allowed'');
La página de documentación para 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 está utilizando PHP ....
Aunque no es exhaustivo, los posibles valores de retorno incluyen aolserver, apache, apache2filter, apache2handler, caudium, cgi (hasta PHP 5.3), cgi-fcgi, cli, continuidad, embebido, isapi, litespeed, milter, nsapi, phttpd, pi3web, roxen, thttpd, tux y webjames.
No estoy seguro de por qué hop 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, entonces quizás pueda auditar todos los servidores web posibles. que PHP puede ejecutarse 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 de 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 del ejemplo indica:
Este ejemplo busca la subcadena cgi porque también puede ser cgi-fcgi.
Use 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, embebido, 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()
.
creo
$_SERVER[''REMOTE_ADDR'']
no se completará desde la CLI.
Además, todas las claves HTTP_ * en el $ _SERVER superglobal no se llenarán desde la CLI, o lo harán de la manera correcta que acabo de mencionar :-)