Más con Symfony

13.17. Utilizando STDIN

Como las tareas se ejecutan en una consola de comandos, también tienes acceso a la entrada estándar STDIN. En UNIX, las aplicaciones pueden interactuar entre si de muchas formas diferentes, una de las cuales se denomina pipe o tubería y se simbolizan mediante el carácter |. El pipe permite conectar la salida de una aplicación (conocida como STDOUT) con la entrada estándar de otra aplicación (conocida como STDIN). Tanto la entrada como la salida estándar son accesibles desde las tareas de Symfony mediante unas constantes especiales de PHP denominadas STDIN y STDOUT. Existe otra constante especial llamada STDERR preparada para mostrar los mensajes de error de las aplicaciones.

¿Qué se puede hacer con la entrada estándar? Imagina que dispones en tu servidor de una aplicación que se quiere comunicar con Symfony. Por supuesto podría comunicarse mediante HTTP, pero una forma mucho más eficiente de hacerlo sería mediante un pipe de su salida a la entrada de la tarea de Symfony. Supongamos que la aplicación puede generar datos estructurados (por ejemplo un array PHP serializado) que describe los objetos que se deben insertar en la base de datos. En este caso, se podría escribir una tarea como la siguiente:

while ($content = trim(fgets(STDIN)))
{
  if ($data = unserialize($content) !== false)
  {
    $object = new Object();
    $object->fromArray($data);
    $object->save();
  }
}

Ahora ya podrías conectar las dos mediante el siguiente comando:

/usr/bin/data_provider | ./symfony data:import

data_provider es la aplicación que genera los objetos y data:import es la tarea que se acaba de crear.