2010-06-10 19 views
11

¿Cuál es la diferencia entre ejecutar php desde la línea de comandos y desde HTTP? ¿Utilizan el mismo ejecutable como (php.exe o php-cgi.exe (Apache o IIS))? ¿Difieren los resultados cuando se ejecutan desde línea de comandos o HTTP?Diferencia entre ejecutar php desde la línea de comandos y desde el lado Http

+0

Esto me suena como una tarea o una pregunta de prueba para mí. No es que eso sea malo ni nada. – Nathan

+0

Realmente debería leer el manual (http://www.php.net/manual/en/features.commandline.php). Te dirá las características de bonificaciones y diferencias, como el shell interactivo, la ejecución de archivos de script, etc. –

Respuesta

2

Tanto si PHP se invoca a través de un módulo de servidor web o CLI, se utiliza la misma base binaria (pero a veces se puede configurar para utilizar ini diferentes que pueden afectar al script). Su entorno también será diferente, por lo que las variables de entorno no serán exactas.

PHP también sabe que se ha invocado de forma diferente y adaptará su salida para que se adapte a eso (es decir, la salida phpinfo(); se formateará de forma diferente cuando se llame a través de CLI).

+0

O usan un binario diferente. La mayoría de las implementaciones que encontré tenían una versión completamente diferente para el módulo cli & apache, a veces ni siquiera la misma versión .... – Wrikken

+0

@Wrikken. Eso debe haber sido hecho a propósito por el administrador por alguna razón. De cualquier manera, me he referido a él ahora como 'base binaria' – webbiedave

1

Cuando está ejecutando php desde la línea de comandos, su servidor apache o iis no tienen ningún rol que jugar. Simplemente usa la carpeta php4 o php5 para ejecutar tu código. Puede haber diferencias con la ejecución según la diferencia en las bibliotecas disponibles y la configuración de php.ini en las dos carpetas. Cuando se ejecuta desde apache php.ini dentro de su apache/bin se usa. Cuando se utiliza desde la línea de comando php.ini desde su carpeta php5 o php4.

2

principal diferencia es el argumento que pasa: que va desde la CLI, usted no tiene $ _GET, $ _POST, $ _SESSION, etc; así que los argumentos tienen que pasarse como parámetros de línea de comandos y se accede utilizando if $ _SERVER ['argc'] y $ _SERVER ['argv'] Tenga cuidado con el directorio en el que se está ejecutando su código y la ruta include; y asegúrese de saber qué php.ini ha cargado. Al imprimir, el marcado HTML no se representa como marcado, pero se visualiza como < h1> etc ... cuidado especialmente para
(PHP_EOL es extremadamente útil) y múltiples espacios o pestañas aparecen como espacios o pestañas múltiples en vez de una único espacio. Olvídese de los encabezados() y otras funciones específicas de http

1

Aparte de lo que ya se ha dicho, es probable que haya diferencias en los privilegios en cuanto a las partes del sistema de archivos accesibles: PHP a través del servidor web se ejecuta como el usuario la línea de comando se ejecuta como usted mismo.

6

Sin Formato HTML en errores
Esta es una configuración php.ini (html_errors), pero este valor predeterminado off en la versión CLI.

registro de salida estándar de errores
Por lo general, los errores se registran en el error.log servidores web, pero en la versión CLI errores se escriben en stderr.
Esto también está disponible como una configuración php.ini (error_log)

php.ini
El archivo php.ini que se utiliza para la versión CLI puede ser un archivo diferente . Lo cual puede ocasionar algunos errores desagradables (curl repentinamente no disponible, etc.).

diferentes ejecutables
Es posible instalar múltiples versiones de PHP (php5 junto php4)
Uso which php para determinar cuál es la versión que está utilizando.

Todo se muestra como texto
var_dump() se puede leer sin <pre>
No hay diferencia entre header('Hello'); y echo('Hello');

0

Aunque esta pregunta es muy antiguo, me gustaría extender @ Bob Fanger de un poco.

Ejecución de archivos PHP desde la línea de comandos es bastante trivial, es suficiente con tener en cuenta que hay algunas diferencias con respecto a la ejecución del archivo en un servidor web o en una interfaz de servidores de línea de comandos:

  • las cookies no hay disponibles

  • Sin $_GET, $_POST, $_SESSION disponibles pero se puede utilizar para obtener parámetros pasados ​​como argumento para el comando. El primer valor es siempre el nombre del archivo.

    Por ejemplo tomado este archivo:

    <?php 
    var_dump($argv); 
    ?> 
    

    llama así:

    [email protected]:$ /usr/bin/php /home/user/file.php foo bar 
    

    le daría esta salida:

    array(4) { 
        [0]=> 
        string(8) "file.php" 
        [1]=> 
        string(3) "foo" 
        [2]=> 
        string(3) "bar" 
    } 
    
  • rutas de archivos completos de la raíz de los servidores requeridos Tendrá que proporcionar las rutas completas a sus archivos (por ejemplo, fo r include(), require(), file_get_contents(), ...), aunque podrían estar en la misma carpeta.

  • diferentes configuraciones de usuario/permiso los archivos no se están ejecutando por www-data usuario, pero el usuario ha iniciado sesión en su máquina. Esto afecta todas las llamadas a función de su archivo que afectan al sistema de archivos de la máquina (por ejemplo, mkdir(), include(), ...) por lo que debe asegurarse de dar el permiso correspondiente a ese usuario.

+1

Agregando a este útil compendio de respuestas, las variables' $ _SERVER' tampoco están disponibles para el script en CLI, como '$ _SERVER ['DOCUMENT_ROOT']' para el acceso incluye en un script. – Martin

Cuestiones relacionadas