Diferencias respecto a otras SAPIs

Principales diferencias de la SAPI CLI respecto a otras SAPI:

  • A diferencia de la SAPI CGI, no se envía ninguna cabecera a la salida.

    Pese a que la SAPI CGI tiene un mecanismo para suprimir las cabeceras HTTP, no existe un equivalente para habilitarlas en la SAPI CLI.

    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 pueda ser posible utilizar antiguos scripts CGI.

    No se cambia el directorio de trabajo al del script (las opciones -C y --no-chdir se mantienen por compatibilidad).

    Mensajes de error en texto plano (no se formatean en HTML).

  • Hay ciertas directivas de php.ini que se ignoran en la SAPI CLI debido a que no tienen sentido en un entorno de consola:

    Directivas php.ini anuladas
    Directiva Valor predeterminado en la SAPI CLI Comentario
    html_errors FALSE Su valor predeterminado es FALSE, ya que puede resultar complicado leer mensajes de error en la consola cuando estos están mezclados con etiquetas HTML no interpretadas.
    implicit_flush TRUE En un entorno de consola, es preferible que las salidas que procedan de print, echo y y similares se muestren inmediatamente y no se mantenga en memoria intermedia. Aun así, es posible utilizar output buffering para postergar o manipular la salida estándar.
    max_execution_time 0 (ilimitado) PHP, en un entorno de consola, tiende a utilizarse para una gama mucho más amplia de los propósitos típicos de scripts basados en web, y como éstos pueden ser de muy larga duración, el tiempo de ejecución máximo se establece a ilimitado.
    register_argc_argv TRUE

    Establecer esta directiva a TRUE significa que los scripts ejecutados mediante la SAPI CLI siempre tienen acceso a argc (número de argumentos que se le pasan a la aplicación) y argv (array con los argumentos en sí).

    Las variables de PHP $argc y $argv se establecen automáticamente al valor apropiado cuando se utiliza la SAPI CLI. Esos valores se pueden encontrar también en el array $_SERVER, por ejemplo: $_SERVER['argv']

    output_buffering FALSE

    Aunque la directiva php.ini está codificada como FALSE, las funciones del buffer de salida sí están disponibles.

    max_input_time FALSE

    CLI de PHP no tiene soporte para GET, POST o subidas de ficheros.

    Nota:

    Estas directivas no pueden ser inicializadas con otro valor desde el fichero de configuración php.ini o con un valor personalizado (si se especifica). Esta limitación se debe a que los valores son aplicados después que todos los ficheros de configuración han sido analizados. Sin embargo, sus valores pueden ser cambiados en tiempo de ejecución (aunque esto no es aplicable a todas ellas, como register_argc_argv).

    Nota:

    Se recomienda establecer 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 varias constantes para flujos de entrada/salida.

  • La SAPI CLI no cambia el directorio actual a aquel en el que se encuentra el script ejecutado.

    Ejemplo #1 Ejemplo que muestra las diferencias respecto a la SAPI CGI:

    <?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 aquel en que se encuentre el script ejecutado.

    Al usar la SAPI CLI se obtiene:

    $ pwd
    /tmp
    
    $ php -f otro_directorio/test.php
    /tmp
    

    Esto ofrece una gran flexibilidad a la hora de escribir herramientas de consola en PHP.

    Nota:

    La SAPI CGI admite este comportamiento propio de la SAPI CLI mediante la opción -C al ejecutarlo desde la línea de comandos.