vend / resque
chrisbolton/php-resque 的命名空间版本,支持 Predis,更多依赖注入
Requires
- php: >=5.3.7
- ext-pcntl: *
- psr/log: >=1.0.0
- symfony/console: >=2.5.6
Requires (Dev)
- colinmollenhour/credis: 1.3.*
- monolog/monolog: 1.7.*
- phpunit/phpunit: 4.3.*
- predis/predis: >=0.8.6
Suggests
- ext-phpiredis: Better performance for Predis
- ext-phpredis: Better performance for Credis
- ext-proctitle: Allows php-resque to rename the title of UNIX processes to show the status of a worker.
- colinmoullenhour/credis: Alternative Redis client
- predis/predis: Suggested Redis client
This package is not auto-updated.
Last update: 2022-04-16 04:05:16 UTC
README
命名空间分支
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" } }
要求
任务
队列任务
任务的队列方式如下
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