Source de données : Beanstalk


1Présentation

Beanstalkd est un serveur de file de messages qui sert à enregistrer des ordres de traitement d'un côté, et de l'autre côté de récupérer ces ordres pour les traiter.

Si vous avez correctement configuré les paramètres de connexion à Beanstalkd, Temma crée automatiquement un objet de type \Temma\Datasources\Beanstalk. Par convention, nous partirons du principe que vous avez nommé cette connexion beanstalk dans le fichier etc/temma.php (voir la documentation de la configuration).

La connexion est alors disponible dans le contrôleur en écrivant :

$this->beanstalk

Dans les autres objets gérés par le composant d'injection de dépendances, la connexion à Beanstalkd est accessible en écrivant :

$loader->dataSources['beanstalk']

2Installation

Pour pouvoir se connecter à un serveur Beanstalk, il faut que vous installiez la bibliothèque Pheanstalk. Pour cela, vous pouvez utiliser le gestionnaire de dépendances Composer.

À la racine du projet, exécutez la commande suivante :

$ composer require pda/pheanstalk

3Configuration

Dans le fichier etc/temma.php (voir la documentation de la configuration), vous déclarez le DSN (Data Source Name) qui permet de se connecter au serveur Beanstalkd.

Le DSN permettant de se connecter au serveur Beanstalkd s'écrit de la forme :

beanstalk://SERVEUR[:PORT]/NOM_FILE

Le numéro de port par défaut est le 11300.
Exemple : beanstalk://localhost/tube3


4Spécificités des files de messages

Contrairement aux autres sources de données, l'ajout de messages dans une file de message se fait sans fournir d'identifiant (nom, clé, chemin…). L'identifiant est créé automatiquement par Beanstalkd. Lorsqu'un message est lu, son identifiant est retourné en même temps que ses données ; cet identifiant est utile par la suite pour effacer le message de la file.

En conséquence, Beanstalkd ne permet pas de vérifier l'existence d'un message à partir de son identifiant, ni de sélectionner un message, ni de définir une valeur par défaut lors de la récupération d'un message.


5Appels unifiés

5.1Accès de type tableau

// écriture d'un message (sérialisé)
$this->beanstalk[''] = $data;

// lecture d'un message (désérialisé)
$msg = $this->beanstalk[''];
// retourne un tableau associatif avec les clés "id" et "data"

// effacement d'un message
unset($this->beanstalk[$msg['id']]);

// nombre de messages en attente
$nbr = count($this->beanstalk);

5.2Méthodes générales

// effacement d'un message
$this->beanstalk->remove($msg['id']);

5.3Gestion de données complexes sérialisées

// lecture d'un message (désérialisé)
$msg = $this->beanstalk->get('');
// retourne un tableau associatif avec les clés "id" et "data"

// écriture d'un message (sérialisé)
$this->beanstalk->set('', $msgData);

// écriture de plusieurs messages (sérialisés)
$this->beanstalk->mSet([
    $user1data,
    $user2data,
    $user3data,
]);

5.4Gestion de données brutes

// lecture de données (brutes)
$html = $this->beanstalk->read('');
// retourne un tableau associatif avec les clés "id" et "data"

// écriture d'un message (brut)
$this->beanstalk->write('', $msgData);

// écriture de plusieurs messages (bruts)
$this->beanstalk->mWrite({
    $user1data,
    $user2data,
    $user3data,
]);

// écriture d'une message (brut) à partir d'un fichier local
$this->beanstalk->copyTo('', '/path/to/file');

// écriture de plusieurs données (brutes) à partir de fichiers locaux
$this->beanstalk->mCopyTo([
    '/path/to/file1',
    '/path/to/file2',
    '/path/to/file3',
]);

6Appels spécifiques

6.1touch()

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

Cette méthode sert à indiquer au serveur Beanstalkd que le message est encore en cours de traitement, évitant ainsi qu'il ne soit distribué de nouveau.
Exemple :

// récupération du prochain message à traiter
$msg = $this->beanstalk->get('');

// traitement...

// indique au serveur que le traitement est toujours en cours
$this->beanstalk->touch($msg['id']);

// suite des traitements...

// effacement du message
$this->beanstalk->remove($msg['id']);