vend/resque

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

chrisbolton/php-resque 的命名空间版本,支持 Predis,更多依赖注入

2.1.1 2015-02-10 22:32 UTC

README

命名空间分支

Build Status Latest Stable Version Latest Unstable Version License

Resque 是一个基于 Redis 的库,用于创建后台任务,将任务放入一个或多个队列,并在稍后处理。

这是 Resque 工作器和任务类的 PHP 分支。这使得它与 resque-web 界面和其他 Resque 库兼容。(例如,您可以从 Ruby 中入队任务,并在 PHP 中出队)。

此库(vend/resque)是在大约 1.3 版本的 chrisboulton/php-resque 的基础上进行的分支,已重构以移除全局状态,添加命名空间,并提高解耦。这使得它更容易使用和扩展。

入门

vend/resque 添加到您的应用程序的 composer.json 文件中。

{
    "require": {
        "vend/resque": "~2.1.0"
    }
}

要求

  • PHP 5.3+
  • Redis 客户端库(例如,PredisCredis

任务

队列任务

任务的队列方式如下

use Resque\Resque;
use Predis\Client;

$resque = new Resque(new Client());
$resque->enqueue('default_queue', 'App\Job', array('foo' => 'bar'), true);

按顺序的参数为:队列、任务类、任务负载、是否启用跟踪。

定义任务

每个任务应在其自己的类中,并实现 Resque\JobInterface。(这很简单,只需要一个自定义方法:perform()。)大多数时候,您会想使用任务的默认实现,并扩展 Resque\AbstractJob 而不是自己实现接口

namespace App;

use Resque\AbstractJob;

class Job extends AbstractJob
{
    public function perform()
    {
        // work work work
        $this->doSomething($this->payload['foo']);
    }
}

任务抛出的任何异常都会导致任务失败 - 请在这里小心,并确保您处理了不应导致任务失败的那些异常。

任务状态跟踪

vend/resque 有能力对队列中的任务执行基本状态跟踪。状态信息将允许您检查任务是否在队列中、正在运行、已完成或已失败。

要跟踪任务状态,请将 true 作为 Resque\Resque::enqueue 的第四个参数传递。将返回用于跟踪任务状态的 ID

$id = $resque->enqueue('default_queue', 'App\Job', $payload, true);
echo $id; // [0-9a-f]{32}

要获取任务的状态

$factory = new Resque\Job\StatusFactory($resque);

// Pass the ID returned from enqueue
$status = $factory->forId($id);

// Alternatively, to get the status for a Job instance:
$status = $factory->forJob($job);

// Outputs the status as a string: 'waiting', 'running', 'complete', etc.
echo $status->getStatus();

状态对象包含用于向跟踪状态添加其他属性的方法。(例如,您可能使用状态对象来跟踪错误、完成信息、迭代等。)

状态

任务状态在 Resque\Job\Status 类中定义为常量。有效状态包括

  • Resque\Job\Status::STATUS_WAITING - 任务仍在队列中
  • Resque\Job\Status::STATUS_RUNNING - 任务正在运行
  • Resque\Job\Status::STATUS_FAILED - 任务已失败
  • Resque\Job\Status::STATUS_COMPLETE - 任务已完成

任务完成或失败后,状态信息可保留至最多24小时,然后自动过期。也可以通过在状态类上调用stop()方法强制过期状态。

控制台

您可以通过继承Worker类来自由实现自己的守护进程/工作池策略。对于实验性和低吞吐量应用程序,您可能喜欢使用内置的控制台命令。

本库版本使用Symfony2控制台组件。但它必须配置Redis连接的详细信息。我们以与Doctrine2控制台组件获取数据库连接详细信息相同的方式完成此操作:通过cli-config.php文件。

本仓库中包含一个cli-config.php示例。

如果您正在运行全栈Web应用程序,通常会在该文件中使用定位器/服务容器来填充Redis客户端连接。(默认使用Predis,连接到127.0.0.1:6379)。

基本用法

resque <subcommand>

Available commands:
  enqueue       Enqueues a job into a queue
  help          Displays help for a command
  list          Lists commands
  worker        Runs a Resque worker
queue
  queue:clear   Clears a specified queue
  queue:list    Outputs information about queues

入队

此命令将在default队列中入队一个Some\Test\Job任务。请注意类名周围的单引号:当在命令行中指定反斜杠时,您可能需要避免您的shell转义它们。

resque enqueue default 'Some\Test\Job' -t

工作器

此命令将在两个队列上运行一个简单的预fork工作器

resque worker -Q default -Q some_other_queue

(-q表示静默,-Q指定队列)。您还可以指定不指定队列,或特殊队列'*'(注意shell扩展)。

队列信息

有几个有用的命令可以获取有关队列的信息。这将显示队列列表以及每个队列上等待的任务数量

resque queue:list

此命令将清除指定的队列

resque queue:clear default

日志记录

现在,库使用PSR3。当作为控制台组件运行时,您可以在cli-config.php中自定义要使用的日志记录器。(例如,您可能希望将工作器日志发送到Monolog。)

为什么要分叉?

遗憾的是,现有版本的php-resque的几个问题使其成为重构的候选者

  • php-resque支持Credis连接库,并使用静态访问器硬编码了此支持。这意味着像复制和管道这样的高级功能不可用。
    • 现在,PHP的Resque支持实现Redis命令适当子集的任何客户端对象。不会对传入的连接进行类型检查,这意味着您可以使用Predis,或者您喜欢使用任何其他内容。
  • 尽管php-resque的公共API很好,但受保护的API几乎毫无用处。这使得扩展工作器类以不同方式调度任务变得很困难。
  • 重要的状态(底层连接)被静态访问器(Resque::redis())隐藏在全局范围内,这使事情变得更容易对库作者来说(因为它们不需要考虑依赖项),但也将库中的类静态地联系在一起:这使得测试和扩展库变得困难。
    • 没有理由这样做:Resque实例应简单地使用DI并接受客户端连接作为必需的构造函数参数。
    • 这种改进还允许在不扩展Resque类的情况下模拟连接。
    • 它还允许您重用现有的Redis连接,如果您有一个的话。无需打开新连接即可入队一个任务。
  • 统计类没有合理的理由是静态的。
    • 为了工作,统计需要连接到Redis,一个名称以及几个方法(获取、设置)。状态及其操作方法?听起来这是对象的任务!不是静态方法,静态方法不封装任何状态。
    • 因为这些是静态调用,所以Resque_Stat类被硬编码到几个其他类中,并且无法轻松扩展。
  • 现在库已经完全命名空间并且与PSR-0兼容。顶级命名空间是Resque
  • 事件系统已被移除。现在对其的需求很少。看起来事件系统只是由于Worker类扩展性差而采取的一个权宜之计。库应该允许你扩展任何类,而且没有方法应该过长或难以移动到子类中。

贡献者

以下是早期版本的贡献者列表,可在chrisboulton/php-resque找到

  • @chrisboulton
  • @acinader
  • @ajbonner
  • @andrewjshults
  • @atorres757
  • @benjisg
  • @cballou
  • @chaitanyakuber
  • @charly22
  • @CyrilMazur
  • @d11wtq
  • @danhunsaker
  • @dceballos
  • @ebernhardson
  • @hlegius
  • @hobodave
  • @humancopy
  • @JesseObrien
  • @jjfrey
  • @jmathai
  • @joshhawthorne
  • @KevBurnsJr
  • @lboynton
  • @maetl
  • @matteosister
  • @MattHeath
  • @mickhrmweb
  • @Olden
  • @patrickbajao
  • @pedroarnal
  • @ptrofimov
  • @rajibahmed
  • @richardkmiller
  • @Rockstar04
  • @ruudk
  • @salimane
  • @scragg0x
  • @scraton
  • @thedotedge
  • @tonypiper
  • @trimbletodd
  • @warezthebeef