Fuente de datos: Beanstalk


1Presentación

Beanstalkd es un servidor de colas de mensajes, que por un lado registra órdenes de procesamiento, y por otro las recupera para procesarlas.

Si has configurado correctamente los parámetros de conexión a Beanstalkd, Temma crea automáticamente un objeto de tipo \Temma\Datasources\Beanstalk. Por convención, supondremos que has llamado a esta conexión beanstalk en el archivo etc/temma.php (consulta la documentación de configuración).

La conexión está entonces disponible en el controlador escribiendo:

$beanstalk = $this->beanstalk;

En otros objetos gestionados por el componente de inyección de dependencias, la conexión a Beanstalkd es accesible escribiendo:

$beanstalk = $loader->dataSources->beanstalk;
$beanstalk = $loader->dataSources['beanstalk'];

2Instalación

Para conectarte a un servidor Beanstalk, necesitas instalar la biblioteca Pheanstalk. Para ello, puedes usar el gestor de dependencias Composer.

En la raíz del proyecto, ejecuta el siguiente comando:

$ composer require pda/pheanstalk

3Configuración

En el archivo etc/temma.php (consulta la documentación de configuración), declaras el DSN (Data Source Name) usado para conectarte al servidor Beanstalkd.

El DSN usado para conectarte al servidor Beanstalkd se escribe así:

beanstalk://SERVIDOR[:PORT]/NOMBRE_COLA

El número de puerto por defecto es 11300.
Ejemplo: beanstalk://localhost/tube3


4Particularidades de las colas de mensajes

A diferencia de otras fuentes de datos, los mensajes se añaden a una cola de mensajes sin proporcionar un identificador (nombre, clave, ruta, etc.). El identificador es creado automáticamente por Beanstalkd. Cuando se lee un mensaje, su identificador se devuelve junto con sus datos; este identificador se usa posteriormente para eliminar el mensaje de la cola.

En consecuencia, Beanstalkd no permite comprobar la existencia de un mensaje a partir de su identificador, ni seleccionar un mensaje, ni definir un valor por defecto al recuperar un mensaje.


5Llamadas unificadas

5.1Acceso tipo array

// escribir un mensaje (serializado)
$beanstalk[''] = $data;

// leer un mensaje (deserializado)
// bloqueante hasta que haya un mensaje disponible
// devuelve un array asociativo con las claves "id" y "data"
$msg = $beanstalk[''];

// eliminar un mensaje
unset($beanstalk[$msg['id']]);

// número de mensajes en espera
$cnt = count($beanstalk);

5.2Métodos generales

// eliminar un mensaje
$beanstalk->remove($msg['id']);

5.3Gestión de datos serializados complejos

// leer un mensaje (deserializado)
// bloqueante hasta que haya un mensaje disponible
// devuelve un array asociativo con las claves "id" y "data"
$msg = $beanstalk->get('');

// escribir un mensaje (serializado)
$beanstalk->set('', $msgData);

// escribir varios mensajes (serializados)
$beanstalk->mSet([
    $user1data,
    $user2data,
    $user3data,
]);

5.4Gestión de datos en bruto

// leer un mensaje (bruto)
// bloqueante hasta que haya un mensaje disponible
// devuelve un array asociativo con las claves "id" y "data"
$html = $beanstalk->read('');

// escribir un mensaje (bruto)
$beanstalk->write('', $msgData);

// escribir varios mensajes (brutos)
$beanstalk->mWrite([
    $user1data,
    $user2data,
    $user3data,
]);

// escribir un mensaje (bruto) a partir de un archivo local
$beanstalk->copyTo('', '/path/to/file');

// escribir varios mensajes (brutos) a partir de archivos locales
$beanstalk->mCopyTo([
    '/path/to/file1',
    '/path/to/file2',
    '/path/to/file3',
]);

6Llamadas específicas

6.1touch()

touch(string $id) : \Temma\Datasources\Beanstalk

Este método le indica al servidor Beanstalkd que el mensaje todavía se está procesando, evitando así que sea distribuido de nuevo.
Ejemplo:

// recuperar el siguiente mensaje a procesar
$msg = $beanstalk->get('');

// procesamiento...

// indicar al servidor que el procesamiento sigue en curso
$beanstalk->touch($msg['id']);

// más procesamiento...

// eliminar el mensaje
$beanstalk->remove($msg['id']);