dspacelabs/queue

此包已被弃用且不再维护。未建议替代包。

PHP通用的抽象队列库,支持多种不同的队列系统

v0.2.0 2017-10-03 19:26 UTC

This package is not auto-updated.

Last update: 2020-06-02 23:01:27 UTC


README

PHP通用的队列库,支持多种不同的队列系统。

更多文档,请参阅 wiki

安装

composer require dspacelabs/queue

使用方法

<?php

use Dspacelabs\Component\Queue\Message;

// Publishing messages to a queue
$message = new Message($body);
$queue->publish($message);
/**
 * This will publish a message to the queue you created, the $body can be
 * anything you want.
 */

// Receive messages
$message = $queue->receive();
$body    = $message->getBody();
// ... Process Data ...
/**
 * $message will be the message that was published. `->receive()` can be put
 * into a foreach loop if you want to continue to process the queue until
 * all the messages are processed, use a for loop in you only want to process
 * a small number of the messages
 */

/**
 * Once you are done processing a message, it needs to be deleted from the queue
 */
$queue->delete($message);

消息、队列、代理

消息被发布到队列中。当你从队列接收到消息时,你将与此类交互。

队列是你发布消息的地方。例如,一个队列可以是AWS SQS、RabbitMQ或其他你所能想到的任何队列。

代理帮助你跟踪队列。因此,你不必在各个地方都有100个不同的队列对象,你只需将它们全部添加到代理中,让代理处理它们。你只需要你需要的那些。

使用FileQueue

FileQueue会将消息存储在磁盘上,适用于本地开发。

消息以“name.timestamp.message”的文件命名格式存储在磁盘上,因此你可以有多个文件队列共享同一目录。

<?php

use Dspacelabs\Component\Queue\FileQueue;
use Dspacelabs\Component\Queue\Message;

$queue = new FileQueue('queue.name', '/tmp/');
$queue->publish(new Message('Hello World!'));

// ...

$message = $queue->receive();
$body = $message->getBody(); // $body === "Hello World!"
$queue->delete($message);

使用SqsQueue

需要Amazon PHP SDK。

php composer.phar require aws/aws-sdk-php
<?php

use Aws\Credentials\Credentials;
use Aws\Sqs\SqsClient;
use Dspacelabs\Component\Queue\SqsQueue;

$credentials = new Credentials($accessKey, $secretKey);
$client = new SqsClient([
    'version'     => 'latest',
    'region'      => 'us-east-1',
    'credentials' => $credentials,
]);

$queue  = new SqsQueue($client, $queueUrl, $name);

使用StandardQueue

标准队列主要用于测试。一旦设置好,你可以快速测试你的工作流程。请注意,这有一些缺点,主要是消息不持久化。

<?php

// First you need to setup the Queue
$queue = new \Dspacelabs\Component\Queue\StandardQueue('queue.name');

// Create a message that will be sent to the queue
$message = new \Dspacelabs\Component\Queue\Message('Hello World A');

// Publish the message
$queue->publish($message);

// Consume all messages
/** @var Message $msg **/
while ($msg = $queue->receive()) {
    // process message
    // ...
    // Delete the Message from the queu
    $queue->delete($msg);
}

注意:当使用StandardQueue时,你不需要像这个示例中那样删除消息 $queue->delete($msg); 然而,有些队列支持此功能。

使用RedisQueue

要使用RedisQueue,您需要安装Predis

composer require predis/predis

完成之后,您就可以开始使用Redis作为可能的队列之一了。

<?php

use Predis\Client;
use Dspacelabs\Component\Queue\RedisQueue;

$client = new Client();
$queue  = new RedisQueue($client, 'queue.name');

有关Predis的文档,请参阅 https://github.com/nrk/predis

使用代理

如果您有多个队列,您可以使用代理,它将帮助您管理您拥有的各种队列。例如,您可能在使用多个SQS队列,并希望有一个单一的位置来访问它们。代理将帮助您做到这一点。

重要的是指出,代理支持此库中的所有队列类型。因此,您可以使用SQS队列、标准队列或您自己制作的自定义队列。

<?php

use Dspacelabs\Component\Queue\Broker;

$broker = new Broker();

// I assume you already have a queue
$broker->addQueue($queue);

// `queue.name` is the name given to the queue you created
// I assume you already have a `$message` created
$broker->get('queue.name')->publish($message);
$broker->get('queue.other')->publish($messageOther);

变更日志

请参阅 CHANGELOG.md

许可证

版权所有 (c) 2015-2017 dSpace Labs LLC

完整许可证请参阅 LICENSE