altmetric / reliable-queue
一个基于Redis的可靠队列库
Requires (Dev)
- phpunit/phpunit: ^4.8
This package is not auto-updated.
Last update: 2023-10-28 14:25:17 UTC
README
一个由Redis支持的可靠队列的PHP库。
当前版本 0.4.0
支持的PHP版本 5.3, 5.4, 5.5, 5.6, 7
安装
$ composer require altmetric/reliable-queue
使用
<?php use Altmetric\ReliableQueue; use Altmetric\ChunkedReliableQueue; use Altmetric\PriorityReliableQueue; $queue = new ReliableQueue('unique-worker-name', 'to-do-queue', $redis, $logger); $queue[] = 'some-work'; $queue[] = 'some-more-work'; foreach ($queue as $work) { // Perform some action on each piece of work in the to-do-queue } $queue = new ChunkedReliableQueue('unique-worker-name', 100, 'to-do-queue', $redis, $logger); foreach ($queue as $chunk) { // $chunk will be an array of up to 100 pieces of work } $queue = new PriorityReliableQueue('unique-worker-name', array('critical-queue', 'default-queue', 'low-priority-queue'), $redis, $logger); foreach ($queue as $name => $work) { // $work will be popped from the queue $name in the priority order given }
API文档
public ReliableQueue::__construct(string $name, string $queue, Redis $redis, LoggerInterface $logger)
$queue = new \Altmetric\ReliableQueue('unique-worker-name', 'to-do-queue', $redis, $logger);
使用以下参数实例化一个可靠队列对象
$name
: 一个唯一的字符串名称,以便在崩溃事件中恢复任何未完成的工作;$queue
: 使用Redis列表作为队列的字符串键;$redis
: 一个用于与Redis通信的Redis
客户端对象;$logger
: 一个符合Psr\Log\LoggerInterface
的记录器。
返回的对象实现了PHP中的Iterator
(因此也是Traversable
)和ArrayAccess
接口。
这意味着它可以被迭代,每次迭代产生队列名称和值。内部,库将阻塞以等待新工作,但对于客户端而言这是不可见的。
foreach ($queue as $key => $work) { // $key will be the queue key name in Redis // $work will be the value popped from the queue }
您也可以通过使用典型的数组操作来修改队列,就像它是一个数组一样
$queue[] = 'work'; // enqueues work $queue[1]; // returns work at index 1 if it exists $queue[1] = 'work'; // sets work to index 1 in the queue unset($queue[1]); // remove work at index 1 from the queue
public ChunkedReliableQueue::__construct(string $name, int $size, string $queue, Redis $redis, LoggerInterface $logger)
$queue = new \Altmetric\ChunkedReliableQueue('unique-worker-name', 100, 'to-do-queue', $redis, $logger);
使用以下参数实例化一个新的分块可靠队列对象
$name
: 一个唯一的字符串名称,以便在崩溃事件中恢复任何未完成的工作;$size
: 每次迭代返回的最大块大小的整数;$queue
: 使用Redis列表作为队列的字符串键;$redis
: 一个用于与Redis通信的Redis
客户端对象;$logger
: 一个符合Psr\Log\LoggerInterface
的记录器。
返回的对象在PHP中实现了Iterator
(因此也是Traversable
)接口。
这意味着它可以被迭代,每次迭代产生队列名称和最多$size
个元素的数组。内部,库将阻塞以等待新工作,但对于客户端而言这是不可见的。
如果队列包含足够的项,则工作块将包含最多$size
个元素,但如果工作不足,则可能返回更少的元素(但至少为1个值)。
public PriorityReliableQueue:__construct(string $name, array $queues, Redis $redis, LoggerInterface $logger)
$queue = new \Altmetric\PriorityReliableQueue('unique-worker-name', array('critical-queue', 'default-queue', 'low-priority-queue'), $redis, $logger);
使用以下参数实例化一个新的按优先级排序的可靠队列对象
$name
: 一个唯一的字符串名称,以便在崩溃事件中恢复任何未完成的工作;$queues
: 一个包含按优先级顺序给出的Redis列表字符串键的数组,用作队列;$redis
: 一个用于与Redis通信的Redis
客户端对象;$logger
: 一个符合Psr\Log\LoggerInterface
的记录器。
返回的对象在PHP中实现了Iterator
(因此也是Traversable
)接口。
这意味着可以使用 foreach
进行迭代,每次迭代都会返回队列名称和值。队列将根据在 $queues
中给出的优先级顺序随机检查是否有工作。这意味着第一个队列将比第二个队列被检查得更频繁,第二个队列比第三个队列,以此类推。在内部,库将重复轮询以查找新工作,但从客户端的角度来看,这是不可见的。
foreach ($queue as $key => $work) { // $key will be the queue key name in Redis // $work will be the value popped from the queue }
参考资料
致谢
- 感谢 James Adam 建议测试优先级队列随机性的方法。
许可证
版权所有 © 2016-2017 Altmetric LLP
在MIT许可证下分发。