Fonte de dados: Beanstalk


1Apresentação

O Beanstalkd é um servidor de fila de mensagens, que por um lado registra ordens de processamento, e por outro recupera essas ordens para processá-las.

Se você configurou corretamente os parâmetros de conexão do Beanstalkd, o Temma cria automaticamente um objeto do tipo \Temma\Datasources\Beanstalk. Por convenção, vamos considerar que você nomeou essa conexão beanstalk no arquivo etc/temma.php (veja a documentação de configuração).

A conexão fica então disponível no controlador ao escrever:

$beanstalk = $this->beanstalk;

Em outros objetos gerenciados pelo componente de injeção de dependências, a conexão ao Beanstalkd é acessível ao escrever:

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

2Instalação

Para se conectar a um servidor Beanstalk, você precisa instalar a biblioteca Pheanstalk. Para isso, você pode usar o gerenciador de dependências Composer.

Na raiz do projeto, execute o seguinte comando:

$ composer require pda/pheanstalk

3Configuração

No arquivo etc/temma.php (veja a documentação de configuração), você declara o DSN (Data Source Name) usado para se conectar ao servidor Beanstalkd.

O DSN usado para se conectar ao servidor Beanstalkd é escrito da seguinte forma:

beanstalk://SERVIDOR[:PORT]/NOME_FILA

O número de porta padrão é 11300.
Exemplo: beanstalk://localhost/tube3


4Características específicas das filas de mensagens

Ao contrário de outras fontes de dados, as mensagens são adicionadas a uma fila de mensagens sem fornecer um identificador (nome, chave, caminho etc.). O identificador é criado automaticamente pelo Beanstalkd. Quando uma mensagem é lida, seu identificador é retornado junto com seus dados; esse identificador é usado posteriormente para apagar a mensagem da fila.

Consequentemente, o Beanstalkd não permite verificar a existência de uma mensagem a partir do seu identificador, nem selecionar uma mensagem, nem definir um valor padrão ao recuperar uma mensagem.


5Chamadas unificadas

5.1Acesso do tipo array

// escreve uma mensagem (serializada)
$beanstalk[''] = $data;

// lê uma mensagem (desserializada)
// bloqueante até que uma mensagem esteja disponível
// retorna um array associativo com as chaves "id" e "data"
$msg = $beanstalk[''];

// apaga uma mensagem
unset($beanstalk[$msg['id']]);

// número de mensagens em espera
$cnt = count($beanstalk);

5.2Métodos gerais

// apaga uma mensagem
$beanstalk->remove($msg['id']);

5.3Gerenciamento de dados serializados complexos

// lê uma mensagem (desserializada)
// bloqueante até que uma mensagem esteja disponível
// retorna um array associativo com as chaves "id" e "data"
$msg = $beanstalk->get('');

// escreve uma mensagem (serializada)
$beanstalk->set('', $msgData);

// escreve várias mensagens (serializadas)
$beanstalk->mSet([
    $user1data,
    $user2data,
    $user3data,
]);

5.4Gerenciamento de dados brutos

// lê uma mensagem (bruta)
// bloqueante até que uma mensagem esteja disponível
// retorna um array associativo com as chaves "id" e "data"
$html = $beanstalk->read('');

// escreve uma mensagem (bruta)
$beanstalk->write('', $msgData);

// escreve várias mensagens (brutas)
$beanstalk->mWrite([
    $user1data,
    $user2data,
    $user3data,
]);

// escreve uma mensagem (bruta) a partir de um arquivo local
$beanstalk->copyTo('', '/path/to/file');

// escreve várias mensagens (brutas) a partir de arquivos locais
$beanstalk->mCopyTo([
    '/path/to/file1',
    '/path/to/file2',
    '/path/to/file3',
]);

6Chamadas específicas

6.1touch()

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

Esse método informa ao servidor Beanstalkd que a mensagem ainda está sendo processada, evitando assim que ela seja distribuída novamente.
Exemplo:

// recupera a próxima mensagem a ser processada
$msg = $beanstalk->get('');

// processamento...

// informa ao servidor que o processamento ainda está em andamento
$beanstalk->touch($msg['id']);

// mais processamento...

// apaga a mensagem
$beanstalk->remove($msg['id']);