altmetric/reliable-queue

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

一个基于Redis的可靠队列库

v0.4.0 2017-08-11 15:40 UTC

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许可证下分发。