bprs/resque

BPRS 风格的 chrisbolton/php-resque 端口,支持 Predis,更多依赖注入

2.1.1 2015-02-10 22:32 UTC

This package is not auto-updated.

Last update: 2024-09-23 10:02:14 UTC


README

关于

这是 GitHub 上的 vent/resque 仓库的分支,网址为 https://github.com/vend/php-resque。目的是在不依赖 vent 实现的情况下改进这个包。原始包(chrisboulton/php-resque)和 vend 的开发已经很久没有更新了。命名空间似乎比原始实现有了巨大的改进。未来的更新将包括出队和更多功能。

命名空间分支

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

入队

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

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

工作进程

此命令将在两个队列上运行一个简单的预分叉工作进程

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
  • 事件系统已被删除。现在几乎没有必要了。看起来事件系统只是由于工作进程类扩展性差而采取的一个权宜之计。库应该允许你扩展你喜欢的任何类,并且没有任何方法应该太长或难以移动到子类中。

贡献者

以下是早期版本的贡献者列表,来自 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