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.

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: getopt())

<?php
echo "Nombre del script: $argv[0] \n";
echo "Parámetros: $argv[1] $argv[2] $argv[3] \n"
?>
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)

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
<?php
echo "Hola Freaks!\n";
?> 
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
filtro.php
<?php
if (preg_match('/\.(?:png|jpg|jpeg|gif|txt)$/', $_SERVER["REQUEST_URI"])) {
    return false;    // serve the requested resource as-is.
} else {
    echo "<p>Acceso denegado :-(</p>";
}
?>

Ejemplo: Reutilizar el mismo fichero php y mostrar diferente contenido en base a si se usa bajo php cli server o un servidor web normal.

<?php
if (php_sapi_name() == 'cli-server') {
   echo "Estás visitando un servidor web creado con PHP-CLI";
}
else{
   echo "Estás visitando un servidor web normal y corriente";
}
?>

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
phpinfo();
?>
php -s script2.php
 
<CODE><span style="color: #000000"> <span style="color: #0000BB">&lt;?php<br />phpinfo</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">?&gt;<br /></span></span></CODE>

php -w: Eliminar comentarios y espacios en blanco sobrantes (compacta el código).

php -w IndexController2.php
<?php
 require_once 'Zend/Controller/Action.php'; class IndexController2 extends Zend_Controller_Action { public function indexAction() { } }

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 --rz Xdebug
Zend Extension [ Xdebug 2.2.1 Copyright (c) 2002-2012 by Derick Rethans <http://xdebug.org/docs/faq#api> ]
php --rf phpinfo
Function [ <internal:standard> function phpinfo ] {

  - Parameters [1] {
    Parameter #0 [ <optional> $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

  1. Usar comillas simples en vez de dobles siempre que sea posible.
  2. Al concatenas cadenas, mejor usar “echo” que “print”.

Enlaces de interés: