===== Guía rápida y trucos de la linea de comandos de PHP (PHP-CLI) =====
PHP CLI es una abreviación de interfaz PHP para la línea de comandos. Como su nombre lo indica, es una manera de usar PHP desde la línea de comandos del sistema, permite ejecutar scripts PHP sin necesidad de un servidor web. Permite aplicar todas las ventajas y potencia de PHP al shell scripting, como por ejemplo el procesamiento multihilo e incluso al escritorio con PHP + GTK. También es útil para lanzar tarear programas en php, acceder a STDIN, STDOUT, STERR, etc. También es una herramienta muy recomendada para hacer debugging de código PHP sin tener que ir a logs o reconfigurar el servicio.
Está disponible en todos los sistemas operativos: GNU/Linux, Windows, OSX, Solaris y disponible en los repositorios de las distribuciones más populares. PHP CLI es sólo un nuevo tipo de SAPI (Application Server Programming Interface) centrado en el uso de aplicaciones de consola / escritorio.
**Diferencias respecto a otras SAPIs**.
* A diferencia de CGI SAPI, no se envía ninguna cabecera a la salida.
* CGI SAPI tiene un mecanismo para desactivar las cabeceras HTTP, no existe un equivalente para habilitarlas en CLI SAPI.
* 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).
* 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 antigüos scripts CGI.
**Directorio de trabajo**. (No cambia, es siempre el que se utilice en la shell).
pwd
/tmp
php -f otro_directorio/test.php
/tmp
# La opción "-f" no es obligatoria.
**Argumentos**: La variable $argv es un array que contiene todos los argumentos pasados a un script cuando se ejecuta desde la línea de comandos. El primer argumento $argv[0] siempre es el nombre del fichero que fue usado para ejecutar el script. (Leer: [[http://php.net/manual/es/function.getopt.php| getopt()]])
php script2.php param1 param2 param3
Nombre del script: script2.php
Parámetros: param1 param2 param3
Nota: Esta variable no está disponible si "register_argc_argv" está deshabilitado.
**php -B** / **-R** o **-F** / **-E** (PHP >= 5)
* **-B %%--%%process-begin**: Código PHP a ejecutar antes de procesar la entrada.
* **-E %%--%%process-end**: Código PHP a ejecutar tras procesar cada línea. (No se puede utilizar junto con -F)
* **-F %%--%%process-file**: Fichero PHP a ejecutar por cada línea de entrada. (no se puede utilizar junto con -E)
* **-R %%--%%process-code**: Código PHP a ejecutar por cada línea de entrada. Hay dos variables disponibles en este modo: //$argn// contendrá la línea que PHP está procesando en un momento dado y //$argi// contendrá el número de línea.
find bin/ | php -B 'echo "COMIENZO \n";' -R 'echo "Linea: $argi --> $argn \n";' -E 'echo "FIN \n";'
COMIENZO
Linea: 1 --> bin/
Linea: 2 --> bin/deactivateLocalRepo.sh
Linea: 3 --> bin/activateLocalRepo.sh
FIN
Ejemplo: Usando las opciones -B , -R y -E para contar el número de líneas de un proyecto.
$ find proyecto/ | php -B '$l=0;' -R '$l += count(@file($argn));' -E 'echo "Lineas totales: $l\n";'
Lineas totales: 37328
**php -c**: Especificar otra configuración de php (se busca el fichero php.ini en las localizaciones predeterminadas por defecto.) o no usar ninguna.
# Utilizar otra configuración de php.
php -c /directorio/propio/fichero-propio.ini mi_script.php
# Ignorar por completo el fichero php.ini.
php -n mi_script.php
php -i: Obtiene información sobre PHP, el equivalente a phpinfo() pero en terminal y sin código html.
**php -r**: Ejecutar una linea de código PHP.
php -r 'phpinfo();' > fichero.txt
php -r 'echo date("W") . "\n";'
php -r 'echo rand(0, 100) . "\n";'
NOTA: Si se quieren utilizar parámetros con la opción -r, un argumento que comience por - provocará errores porque el intérprete de PHP pensará que debe manejarlo él, aún antes de ejecutar el script. Para prevenir esto, utilice el separador de lista de argumentos %%--%%. Una vez que PHP lea este separador, todos los argumentos que lo sigan se pasarán intactos al script.
php -r 'var_dump($argv);' -h # Mostrará la ayuda de PHP
php -r 'var_dump($argv);' -h # Forma correcta
array(2) {
[0] =>
string(1) "-"
[1] =>
string(2) "-h"
}
**php -a**: Shell interactiva de PHP (Uso interactivo). Soporta autocompletado con tabulador. Historial: ~/.php_history.
php -a
Interactive mode enabled
php > echo 5+8;
13
php > function addTwo($n)
php > {
php { return $n + 2;
php { }
php > var_dump(addtwo(2));
int(4)
php >
Ya en PHP 5.4.0, la CLI SAPI provee las configuraciones de php.ini, "cli.pager" y "cli.prompt". La configuración de cli.pager permite a un programa externo (tal como less) para que funcione como un paginador para la salida en lugar de se desplegado directamente en la pantalla. Las configuraciones de cli.prompt permite cambiar el indicador de ingreso de órdenes "php >".
Establecer el paginador a less y cambiar el prompt.
php > #cli.pager=less
php > phpinfo();
(salida desplegada en less)
php > #cli.prompt=PHP Server 1 :>
PHP Server 1 :>
Crear un script en PHP para ejecutarlo sin indicar el interprete.
#!/usr/bin/php
chmod a+x script.php
./script.php
Hola Freaks!
Comprobar la sintaxis de ficheros PHP (lint). NO encuentra errores fatales (como funciones no definidas).
php -l projectsTest.php
No syntax errors detected in projectsTest.php
NOTA: Se recomienda el uso de la opción -d (php -d display_errors XXX.php) para mostrar errores de forma detallada.
**php -S**: Crear un servidor web que sirva / ejecute código php. También es útil para mostrar errores que no muestra la opción "-l". Las peticiones de URI se sirven desde el actual directorio de trabajo donde PHP se inició, a menos que la opción -t sea utilizada para especificar una raíz de documentos explícita.
Si una petición de URI no especifica un fichero, entonces el index.php o index.html que estén en el directorio dado serán devueltos. Si ninguno de los ficheros existen en el directorio, entonces será devuelto una respuesta de código 404. Si se especifica un fichero php, este será siempre ejecutado, útil para filtrar contenido entre otras muchas cosas.
vim index.php
php -S localhost:7777 -t /var/www/html
NOTA: Algo muy útil es combinarlo con la opción "-c" para indicar una configuración específica del servicio de PHP a
probar.
PHP 5.4.6 Development Server started at Mon Feb 23 16:24:06 2013
Listening on http://localhost:7777
Document root is /root
Press Ctrl-C to quit.
[Mon Feb 23 16:24:08 2013] 10.0.212.14:54868 [200]: /
[Mon Feb 23 16:29:38 2013] 10.0.222.11:54867 [500]: / - Call to undefined function foo() in /root/caca.php on line 23
Ejemplo: Filtrar contenido solicitado por visitantes. El fichero filtro.php será ejecutado a cada solicitud que se realice al servidor. En el ejemplo solo permitirá solicitar imágenes y ficheros txt de /mnt/code/.
php -S 0.0.0.0:7777 -t /mnt/code/ filtro.php
Acceso denegado :-(
**php -s**: Crear código html que muestra la sintaxis de ficheros PHP coloreada (Estilo PHP.net). Útil para compartir via web código PHP con sintaxis resaltada. Esta opción no puede funcionar junto con la opción "-r".
cat script2.php
php -s script2.php
<?php
phpinfo();
?>
**php -w**: Eliminar comentarios y espacios en blanco sobrantes (compacta el código).
php -w IndexController2.php
**php -d**: Directivas de configuración, por ejemplo, mostrar errores php al ejecutar scripts desde la linea de comandos. Muy útil para hacer depuración (PHP debuggin) sin tener que buscar en los logs o cambiar la configuración del servidor PHP. Además se muestran solo los errores de ese fichero PHP.
Sintaxis: //php -d directiva_de_configuracion[=valor]//
php -d display_errors mysql.php
Notice: Undefined variable: res in /root/mysql.php on line 5
Call Stack:
0.0009 224952 1. {main}() /root/mysql.php:0
Warning: mysql_fetch_assoc() expects parameter 1 to be resource, null given in /root/mysql.php on line 5
Call Stack:
0.0009 224952 1. {main}() /root/mysql.php:0
0.0023 226376 2. mysql_fetch_assoc() /root/mysql.php:5
NOTA: Si se omite el valor (php -d max_execution_time), se establecerá un "1" a la directiva. Si se pasa un valor vacío (php -d max_execution_time=), se establecerá "" a la directiva.
**Obtener información sobre funciones, clases y extensiones**.
* **php %%--%%rf**: Mostrar información (p.ej. número y nombre de los parámetros) de una función o método.
* **php %%--%%rc**: Mostrar información de una clase (lista de constantes, propiedades y métodos)
* **php %%--%%re**: Muestra información sobre una extension (lista de opciones en php.ini, funciones definidas, constantes y clases).
* **php %%--%%rz**: Muestra información sobre una extension Zend (se puede ver también con phpinfo()).
* **php %%--%%ri**: Muestra información de configuración sobre una extensión dada. (se puede ver también con phpinfo()).
php --rz Xdebug
Zend Extension [ Xdebug 2.2.1 Copyright (c) 2002-2012 by Derick Rethans ]
php --rf phpinfo
Function [ function phpinfo ] {
- Parameters [1] {
Parameter #0 [ $what ]
}
}
**php -m**: Muestra los módulos PHP y Zend incorporados (y habilitados).
php -s script.php > codigo_script_color.html
[PHP Modules]
bz2
calendar
Core
ctype
curl
...
[Zend Modules]
XCache
Xdebug
**php -v**: Obtener el nombre de la SAPI / versión de PHP / Zend.
php -v
PHP 5.4.6 (cli) (built: Aug 20 2012 12:58:24)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies
with XCache v2.0.1, Copyright (c) 2005-2012, by mOo
with Xdebug v2.2.1, Copyright (c) 2002-2012, by Derick Rethans
**php %%--%%ini**: Mostrar ficheros de configuración que utiliza PHP CLI.
php --ini
Configuration File (php.ini) Path: /etc/php5/
Loaded Configuration File: /etc/php5/php-cli.ini
Scan for additional .ini files in: /etc/php5/php.d
Additional .ini files parsed: /etc/php5/php.d/apc.ini,
/etc/php5/php.d/curl.ini,
/etc/php5/php.d/dom.ini,
/etc/php5/php.d/fileinfo.ini,
...
**Optimizar scripts en PHP**.
Video: [[https://www.youtube.com/watch?v=Sibg0T3wKs4]]
- Usar comillas simples en vez de dobles siempre que sea posible.
- Al concatenas cadenas, mejor usar "echo" que "print".
**Enlaces de interés**:
* [[http://php.net/manual/es/features.commandline.interactive.php]]
* [[http://www.php-cli.com/]]