php - desde - ¿Cómo distinguir la invocación de la línea de comando y del servidor web?
php f (2)
¿Hay alguna manera de distinguir si un script fue invocado desde la línea de comando o por el servidor web?
( Consulte ¿Cuál es la forma canónica de determinar la línea de comandos frente a la ejecución http de un script PHP? Para obtener una mejor respuesta y una discusión más detallada, no la encontró antes de publicarla)
Tengo un servidor (no de producción) con Apache 2.2.10 y PHP 5.2.6. En él, en un directorio accesible a través de la web está mi script PHP, maintenance_tasks.php
. Me gustaría invocar este script desde la línea de comando o mediante una solicitud HTTP (abriendo en un navegador). ¿Hay alguna variable que me permita determinar de manera confiable cómo se invoca el script?
(Ya abordé los problemas de diferentes vistas para cada tipo de invocación y el tiempo de espera de respuesta HTTP, solo busco una manera de distinguir entre los dos tipos de invocación)
Probaré cosas diferentes y agregaré mis hallazgos a continuación.
He comparado el superglobal $_SERVER
en ambas invocaciones. Parece que $_SERVER[''argc'']
(es decir, el número de argumentos pasados a la secuencia de comandos) solo se establece cuando se ejecuta desde el shell / línea de comandos:
<?php
if (isset($_SERVER[''argc''])) {
define(''CLI'', true);
} else {
define(''CLI'', false);
}
Eso parece funcionar tanto en los hosts de Linux como de Windows. (Primero pensé en buscar algunas variables de entorno, pero esas son diferentes para cada sistema operativo. Además, $_SERVER[''HTTP_*'']
encabezados $_SERVER[''HTTP_*'']
en la versión CLI, pero no estoy seguro de si eso es lo suficientemente confiable.)
Si se llama desde la línea de comando, la variable de servidor HTTP_USER_AGENT no está configurada. Uso esta constante para definir si el script se llama desde la línea de comandos o no:
define("CLI", !isset($_SERVER[''HTTP_USER_AGENT'']));
ACTUALIZACIÓN: dado que esta respuesta todavía está marcada como la respuesta "correcta", me gustaría revisar mi afirmación. Confiar en el encabezado "User-Agent" puede ser problemático, ya que se trata de un valor definido por el usuario.
Utilice php_sapi_name() == ''cli''
o PHP_SAPI == ''cli''
, como lo sugiere Eugene / cam8001 en los comentarios.
¡Gracias por señalar esto!