Principales diferencias de CLI SAPI respecto a otras SAPIs:
A diferencia de CGI SAPI, no se envía ninguna cabecera a la salida.
Pese a que CGI SAPI tiene un mecanismo para desactivar las cabeceras HTTP, no existe un equivalente para habilitarlas en CLI SAPI.
Por omisión, CLI se inicia en modo silencioso, si bien se mantienen las opciones -q y --no-header por motivos de compatibilidad, de forma que puedan usarse scripts CGI antiguos.
No se cambia el directorio de trabajo al del script (las opciones -C y --no-chdir se mantiene por compatibilidad).
Mensajes de error en texto plano (no se formatean en HTML).
Hay ciertas directivas php.ini que se ignoran en CLI SAPI ya que no tienen sentido en un entorno de consola:
Directiva | Valor por omisión en CLI SAPI | Comentario |
---|---|---|
html_errors | FALSE | Puede resultar complicado leer mensajes de error en la consola cuando éstos están mezclados con etiquetas HTML, por eso, esta directiva se define como FALSE por omisión. |
implicit_flush | TRUE | Es preferible que las salidas que procedan de print(), echo() y similares se muestren inmediatamente y no se cacheen en memoria intermedia. Aun así, puede utilizarse output buffering si se desea aplazar o manejar la salida estándar. |
max_execution_time | 0 (ilimitado) | Debido a las muchas posibilidades disponibles al usar PHP en consola, el tiempo máximo de ejecución se establece como ilimitado. Mientras que las aplicaciones escritas para la web suelen ejecutarse muy rápidamente, las aplicaciones de consola suelen conllevar un mayor tiempo de ejecución. |
register_argc_argv | TRUE |
Dado que esta directiva está a TRUE se podrá acceder a argc (número de parámetros que se le pasan a la aplicación) y argv (array con el contenido de los parámetros) en CLI SAPI. Las variables de PHP $argc y $argv se registran y completan con los valores apropiados cuando se use CLI SAPI. También se puede acceder a esos valores consultando $_SERVER. Ejemplo: $_SERVER['argv'] |
output_buffering | FALSE |
Aunque la directiva php.ini está codificada en PHP como FALSE, las funciones del buffer de salida sí están habilitadas. |
max_input_time | FALSE |
CLI no tiene soporte ni para GET, ni para POST ni para subidas de ficheros. |
Note:
Estas directivas de php.ini no se pueden inicializar con otros valores. Se imponen estas limitaciones porque todos estos valores por omisión no se aplican hasta que se han analizado los ficheros de configuración. En cualquier caso, sus valores se pueden cambiar en tiempo de ejecución (lo cual no tiene mucho sentido en estas directivas, por. ej. register_argc_argv).
Note:
Se recomienda habilitar ignore_user_abort en scripts de línea de comandos. Para más información, consulte ignore_user_abort().
Para facilitar el trabajo en entornos de consola, se definen unas determinadas constantes para flujos de Entrada/Salida.
CLI SAPI no cambia el directorio actual a aquél en el que se encuentra el script ejecutado.
Example #1 Ejemplo que muestra las diferencias respecto a CGI SAPI:
<?php
// Aplicación de pruebas llamada test.php
echo getcwd(), "\n";
?>
Al usar la versión CGI, la salida es:
$ pwd /tmp $ php -q otro_directorio/test.php /tmp/otro_directorio
Esto muestra claramente que PHP cambia el directorio actual a aquél en que se encuentre el script ejecutado.
Al usar CLI SAPI obtenemos:
$ pwd /tmp $ php -f otro_directorio/test.php /tmp
Esto ofrece una gran flexibilidad a la hora de escribir herramientas de consola en PHP.
Note:
CGI SAPI puede funcionar con este comportamiento propio de CLI SAPI usando la opción -C al ejecutarlo desde la línea de comandos.