Todos sabemos lo fantástico que es PHP como lenguaje de programación de páginas web. Lo que no muchos saben es que es igualmente fantástico como lenguaje para realizar programas multiplataforma para la shell. No todo es bash, Python, perl o Microsoft Powershell. Vamos a ver algunas de las cosas que quizás no sabías que podemos hacer con PHP en la consola.

Nota: Toda esta información está disponible en el manual de documentación de PHP.

1. Ejecutar un script

Podemos crearnos nuestros propios programas simplemente creando un fichero .php y ejecutándolo con el binario CLI php. Por ejemplo:

<?php
   echo "hola mundo!n";
?>

Y ahora para ejecutarlo sólo tendríamos que llamar al binario php (php.exe en Windows) seguido del nombre del script. Supongamos que el ejemplo de arriba lo guardamos en un fichero que se llama test.php. Sería así:

$ php test.php

Y en sistemas Windows:

> php.exe test.php

De esta forma, los dos mostrarían en pantalla el texto “hola mundo!”. Fácil, verdad? :)

2. Hacer que el script se sea ejecutable

En Windows tendremos que asociar la extensión .php al binario php.exe. De esa forma, al hacer doble clic sobre un fichero, este se ejecutará. Sin embargo, si quisiéramos que se pudiera ejecutar desde la consola, tendríamos que crear un fichero por lotes .bat que realice la llamada.

@echo OFF
"C:phpphp.exe" test.php

En sistemas Unix es más sencillo. Tenemos que añadir en la primera línea la ruta al binario que ejecuta el script, y posteriormente otorgamos permisos de ejecución al fichero. Y ya está, ya es ejecutable desde la consola y desde el entorno gráfico. El fichero quedaría así:

#!/usr/bin/php
<?php
   echo "hola mundo!n";
?>

Y después damos permisos de ejecución, y ya podremos ejecutarlo:

$ chmod +x test.php
$ ./test.php

3. Pasar parámetros al programa

Supongamos un comando cualquier de la consola, por ejemplo “ls”. Este comando acepta numerosos parámetros para controlar su comportamiento. En PHP también podemos pasar parámetros. Sólo tenemos que tener en cuenta una cosa: Si el script no tiene permisos de ejecución, hay que pasar los parámetros tras los caracteres “–”. Es así para prevenir que el binario php los considere parámetros suyos. Veamos un ejemplo de cómo hacerlo:

$ php test.php — parametro1 parametro2
$ ./test.php parametro1 parametro2

En el primer ejemplo ejecutamos el binario php y le pasamos como parámetro el nombre del script, por lo que en este caso añadimos los caracteres “–”. En cambio, en el segundo no es necesario, ya que el script tiene permisos de ejecución.

En sistemas Windows, como vimos arriba, habría que crear un fichero por lotes .bat, que para que pasara los parámetros a nuestro script quedaría así:

@echo OFF
"C:phpphp.exe" test.php %*

Bien, ya sabemos cómo enviar parámetros al script. Sólo nos queda saber cómo manejarlos. Pues muy sencillo. Hay dos variables globales para manejarlos:

  1. $argc – Contiene el número de parámetros que recibe el script
  2. $argv – Es un array con los parámetros en sí

4. Usar PHP en como consola interactiva

Al igual que ocurre con Python, PHP también puede ejecutarse en modo interactivo. Esto es, introducimos a mano los comandos en una “consola PHP”, y ésta los ejecuta al vuelo. Sólo hay que poner el parámetro “-a”. Por ejemplo:

$ php -a
Interactive shell

php > echo 5+8;
13
php > function sumarDos($n)
php > {
php { return $n + 2;
php { }
php > var_dump(sumarDos(2));
int(4)
php >

Además, pulsando el botón tabulador, tendrás autocompletado de variables, funciones, clases, constantes, método estáticos y constantes de clases.

5. Ejecutar una línea de código PHP al momento

Podemos ejecutar el código que queramos usando el modificador “-r”. Imaginemos que queremos aplicar un hash md5 a un fichero de texto, y no tenemos en nuestro sistema el comando md5sum. Podríamos hacer lo siguiente:

php -r 'echo md5(file_get_contents("fichero.txt"));'

Lo que hacemos es ejecutar los comandos que hay entre las comillas simples:

  1. Cargamos el contenido de ‘fichero.txt’.
  2. Le aplicamos el hash md5.
  3. Lo mostramos en pantalla.

¡Qué de cosas se pueden hacer con esto!

6. Pasar contenidos a PHP por tuberías

Muchas veces vemos comandos como:

echo "hola mundo" | wc -c

En este sencillo ejemplo lo que hemos hecho es en la salida estándar el texto “hola mundo”, que a su vez se envía a la entrada estándar del comando “wc -c”, que se encarga de contar el número de caracteres. ¿Cómo hacemos esto en PHP? Consultando la entrada estándar. En la versión CLI de PHP ponen a nuestra disposición 3 útiles constantes:

  1. STDIN – Stream a la entrada estándar.
  2. STDOUT – Stream a la salida estándar.
  3. STDERR – Stream a la salida de errores.

Si quisiéramos contar el número de caracteres del texto recibido por la entrada estándar en PHP, podríamos hacer lo siguiente:

echo "hola mundo" | php -r 'echo strlen(fgets(STDIN));'

7. Mostrar un fichero PHP sin comentarios ni espacios

¿Nunca te has preguntado cuántos caracteres útiles tiene un gran proyecto? Con el modificador “-w” puedes verlo, pues eliminará todos los caracteres en blanco innecesarios (incluidos tabulares, retornos de carro, cambios de línea, etc), y todos los comentarios. Además, también podrás así minimizar el tamaño de los ficheros. Por ejemplo:

$ php -w fichero.php

8. Consultar documentación desde la consola

Supón que deseas conocer los parámetros de una función, o los métodos de una clase… Puedes consultarlo desde la consola, siempre y cuando tu versión de PHP esté compilada con la extensión Reflection. Esta familia de modificadores nos da 4 opciones:

  1. “–rf” – Muestra información de una función o de un método de una clase.
  2. “–rc” – Muestra información de una clase (sus métodos, atributos, constantes…).
  3. “–re” – Muestra información de una extensión (directivas .ini, funciones, constantes, clases, etc).
  4. “–ri” – Muestra información sobre la configuración de una extensión. Esto es, lo mismo que devuelve phpinfo() para cada extensión. Si queremos ver la información general, usaremos “main” como nombre de extensión.

Veamos un ejemplo en el que consultamos información de la función md5():

$ php --rf md5
Function [ <internal:standard> function md5 ] {
  - Parameters [2] {
    Parameter #0 [ <required> $str ]
    Parameter #1 [ <optional> $raw_output ]
  }
}

Una opción estupenda cuando no tenemos acceso a internet, ni nos hemos descargado la documentación de PHP a nuestro equipo.

9. Decorar la sintaxis de nuestro código

PHP nos ofrece una forma sencillísima de generar una versión HTML de nuestro código, coloreando y destacando cada parte. Sólo tendremos que ejecutarlo con el modificador “-w”. Una vez hecho esto, podremos exportarla al formato que queramos (PDF, Word, XHTML, etc). Muy útil cuando queremos imprimir un código fuente.

$ php -w fichero.php

Además, al estar disponible desde el propio binario de php, es muy fácil generar una versión HTML coloreada de cada fichero.

10. La joya de la corona: definir código inicial, final, y para cada línea

Si no tenías suficiente con sed o awk, ahora con PHP vas a poder hacer maravillas. Tenemos estos cuatro modificadores:

  1. “-B” – Código PHP a ejecutar antes que todo lo demás.
  2. “-F” – Código PHP a ejecutar cuando finalice todo lo demás.
  3. “-R” – Código PHP a ejecutar por cada línea. Tendremos $argn con la línea que se está procesando, y $argi con el número de línea.
  4. “-F” – Fichero con el código PHP a ejecutar por cada línea.

Veamos un ejemplo muy didáctico y muy poco útil de la documentación de PHP. Supongamos que queremos contar el número de líneas de un proyecto. Accedemos a su directorio y ejecutamos lo siguiente:

$ find . | php -B '$lineas=0;' -R '$lineas += count(@file($argn));' -E 'echo "Total de líneas: $lineasn";'

Veámoslo paso a paso:

  1. En primer lugar ejecutamos el comando “find” de la consola de Linux. Nos mostrará (recursivamente) todos los ficheros del directorio actual.
  2. El resultado se lo pasamos por la entrada estándar al binario php, el cual realiza lo siguiente:
    1. En el modificador “-B” especificamos el código inicial. Simplemente inicializamos la variable $lineas a cero.
    2. En el modificador “-R” decimos lo que se hará por cada línea recibida por la entrada estándar. En este caso, cada línea se corresponde con la ruta a un fichero:
      1. Como vimos arriba, $argn contiene el texto que se está procesando. Contiene la ruta a un fichero
      2. Pasamos esa ruta a la función file(), que genera un array donde cada índice contiene una fila del fichero leído.
      3. Consultamos el tamaño del array, es decir, el número de líneas del fichero.
      4. Incrementamos la variable $lineas con el valor obtenido en el paso anterior.
    3. Finalmente, el modificador ‘-E’ se ejecuta al finalizar todo lo demás, y nos muestra como resultado el número total de líneas de texto que hay en todos los ficheros de la carpeta actual.

Sencillísimo y muy potente. Lo que más complicado puede resultar es recordar los 3 modificadores (B,F,R) y las dos variables ($argn y $argi).