torawallet / php-resque
Redis支持的库,用于创建后台任务并在稍后处理它们。
Requires
- php: >=5.3.0
- ext-pcntl: *
- monolog/monolog: ~1.7
- predis/predis: 1.1.*
- symfony/console: ~2.7|~3.0
- symfony/process: ~2.7|~3.0
- symfony/yaml: ~2.7|~3.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ~2.2.0
- phpunit/phpunit: ~4.8
Suggests
- ext-phpiredis: Native PHP extension for Redis connectivity. Predis will automatically utilize when available.
- ext-proctitle: Allows php-resque to rename the title of UNIX processes to show the status of a worker in PHP versions < 5.5.0.
Replaces
- mjphaynes/php-resque: 2.1.*
README
php-resque(发音类似于"rescue")是一个Redis支持的库,用于创建后台任务,将这些任务放入多个队列,并在稍后处理它们。
内容
背景
本版本的php-resque基于chrisboulton最初的工作,他在chrisboulton中将该同名ruby版本移植过来,该版本由GitHub创建。
重新编写之前工作的原因是为了更好地支持工作者服务器的水平扩展,并提高任务故障容忍度以创建一个高度可用的系统。与Monolog的集成意味着可以实现非常详细的日志记录,这使得解决分布式系统中的错误变得容易得多。广泛的事件/钩子系统允许更深入集成和收集统计数据。
本版本提供以下功能:
- 工作者可以在多台机器之间分布。
- 对内存泄漏具有弹性(任务在分叉进程中运行)。
- 期望并记录失败。
- 日志记录使用Monolog。
- 能够将闭包推送到队列中。
- 跟踪任务状态和输出。
- 如果超出内存或最大执行时间,任务将干净地失败。
- 如果分叉的子进程运行任务后不以状态码0退出,则将任务标记为失败。
- 具有内置的事件系统以启用深层次集成的钩子。
- 支持优先级(队列)。
本版本不是GitHub Resque的直接移植,因此与它或其Web界面不兼容。 本版本的Web界面目前正在开发中,如果您想了解更多或提供帮助,请给我发邮件。
要求
运行php-resque之前,您必须安装以下软件
可选,但推荐
入门
使用php-resque的最简单方法是将它作为Composer包安装到您的项目中。 Composer (https://getcomposer.org.cn/)不是强制性的,但它可以使事情变得容易得多。
将php-resque添加到您的应用程序的composer.json
文件中
{ "require": { "mjphaynes/php-resque": "2.1.*" } }
导航到您的项目根目录并运行
$ php composer.phar install
如果您尚未这样做,请将Composer自动加载器添加到项目引导中
require 'vendor/autoload.php';
任务
定义任务
每个任务应在自己的类中,并包含一个perform
方法。
class MyJob { public function setUp() { // Set up environment for this job } public function perform($args) { // Perform some job } public function tearDown() { // Remove environment for this job } }
当运行任务时,将实例化该类,并将任何参数作为参数发送到perform方法。当前的任务实例(Resque\Job
)作为第二个参数传递给perform方法。
作业抛出的任何异常都会导致作业失败 - 在这里要小心,并确保处理不会导致作业失败的异常。如果你想要取消一个作业(而不是让它失败),则可以抛出一个 Resque\Exception\Cancel
异常,作业将被标记为已取消。
作业也可以有 setUp
和 tearDown
方法。如果定义了 setUp
方法,它将在执行方法之前被调用。如果定义了 tearDown
方法,它将在作业完成后被调用。如果在 setUp
方法中抛出异常,则不会执行执行方法。这在有不同作业需要相同的引导程序的情况下很有用,例如数据库连接。
排队任务
要向队列添加新作业,请使用 Resque::push
方法。
$job = Resque::push('MyJob', array('arg1', 'arg2'));
第一个参数是作业类的完全解析类名(如果你想知道 php-resque 如何了解你的作业类,请参阅自动加载作业类)。第二个参数是要传递给作业类的任何参数的数组。
也可以将闭包推送到队列中。这对于需要排队执行的任务非常方便。当将闭包推送到队列中时,不应使用 __DIR__
和 __FILE__
常量。
$job = Resque::push(function($job) { echo 'This is a inline job #'.$job->getId().'!'; });
可以通过将队列名称作为第三个参数传递给 Resque::push
方法,将作业推送到另一个队列(默认队列名为 default
)。
$job = Resque::push('SendEmail', array(), 'email');
延迟任务
可以使用 Resque::later
方法安排作业在未来的指定时间运行。你可以通过传递一个 int
或一个 DateTime
对象来实现。
$job = Resque::later(60, 'MyJob', array()); $job = Resque::later(1398643990, 'MyJob', array()); $job = Resque::later(new \DateTime('+2 mins'), 'MyJob', array()); $job = Resque::later(new \DateTime('2014-07-08 11:14:15'), 'MyJob', array());
如果你传递一个整数,并且它小于 94608000
秒(3年),php-resque 将假设你想要相对于当前时间的相对时间(毕竟,谁会延迟超过3年的作业呢?)。请注意,你必须有一个在指定时间运行的worker,以便作业可以运行。
任务状态
php-resque 跟踪作业的状态。状态信息将允许你检查作业是否在队列中,正在运行,失败等。要跟踪作业的状态,你必须捕获已推送作业的作业ID。
$job = Resque::push('MyJob'); $jobId = $job->getId();
要获取作业的状态
$job = Resque\Job::load($jobId); $status = $job->getStatus();
作业状态定义为 Resque\Job 类中的常量。有效的状态是
Resque\Job::STATUS_WAITING
- 作业仍在队列中Resque\Job::STATUS_DELAYED
- 作业已延迟Resque\Job::STATUS_RUNNING
- 作业正在运行Resque\Job::STATUS_COMPLETE
- 作业已完成Resque\Job::STATUS_CANCELLED
- 作业已被取消Resque\Job::STATUS_FAILED
- 作业已失败false
- 获取状态失败 - ID 是否有效?
状态在作业完成或失败后7天内可用,然后自动过期。此超时可以在配置文件中更改。
工作者
要启动worker,请转到您的项目根目录并运行
$ bin/resque worker:start
请注意,一旦此worker启动,它将继续运行,直到手动停止。您可以使用进程监控程序(如Supervisor)将worker作为后台进程运行,并确保worker不会停止运行。
如果worker是后台任务,您可以使用以下命令停止、暂停和重新启动worker
$ bin/resque worker:stop
$ bin/resque worker:pause
$ bin/resque worker:resume
这些命令接受内联配置选项,同时还会从配置文件中读取。
例如,为了指定工作器只处理名为 high
和 low
的队列上的作业,并且为作业允许最多 30MB
的内存,您可以运行以下命令:
$ bin/resque worker:start --queue=high,low --memory=30 -vvv
请注意,这将首先检查 high
队列,然后是 low
队列,因此可以使用此方法方便地使用作业队列优先级。要运行所有队列,请使用 *
- 这是默认值。使用 -vvv
启用非常详细的日志记录。要禁用任何日志记录,请使用 -q
标志。
有关更多命令和完整选项列表,请参阅命令文档。
此外,如果工作器在不同的主机上运行,您可以通过Redis中的数据远程触发工作器的优雅关闭。例如:
foreach(Resque\Worker::allWorkers() as $worker) { $worker->shutdown(); }
信号
信号在受支持的平台上有效。发送给工作器的信号将产生以下效果:
QUIT
- 等待子进程完成处理然后退出TERM
/INT
- 立即杀死子进程然后退出USR1
- 立即杀死子进程但不退出USR2
- 暂停工作器,不再处理新作业CONT
- 恢复工作器
分叉
当php-resque运行一个作业时,它首先将进程分支到子进程。这是为了如果作业失败,工作器可以检测到作业失败,并将继续运行。分支的子进程将在作业完成时立即退出。
要使用php-resque,必须安装PECL模块(https://php.ac.cn/manual/en/book.pcntl.php)。
进程标题
更新工作器的进程标题很有用,因为它表明工作器正在做什么,并且任何分支的子进程也将设置其进程标题,包括正在运行的作业。这有助于识别服务器上正在运行的过程及其php-resque状态。
不幸的是,PHP默认没有安装更新进程标题的能力。
存在一个PECL模块(http://pecl.php.net/package/proctitle),它为PHP添加了此功能,因此如果您想更新进程标题,请安装PECL模块。php-resque将检测并使用它。
自动加载任务类
启动您的应用程序还需要通过自动加载器或包含它们来通知工作器您的作业类。如果您使用Composer,那么在添加您的作业类时将会相对简单。
或者,您可以在config.yml
文件中或通过设置包含参数来这样做。
$ bin/resque worker:start --include=/path/to/your/include/file.php
本项目中examples/
文件夹中有如何实现这些功能的示例。
命令 & 选项
有关php-resque命令及其相关参数的完整列表,请参阅命令文档。
日志记录
php-resque与Monolog集成,这提供了广泛的日志记录功能。有关完整文档,请参阅日志记录文档。
事件/钩子系统
php-resque具有广泛的事件/钩子系统,允许开发人员在不修改任何核心文件的情况下深入集成库。有关完整文档和所有事件的列表,请参阅钩子文档。
配置选项
有关所有配置选项的完整列表,请参阅配置文档。
Redis
您可以在运行命令时设置Redis连接详情,或者设置配置文件中的设置。
$ bin/resque [command] --host=<hostname> --port=<port>
贡献者
为项目做出贡献将在维护和扩展脚本中起到巨大作用。如果您有兴趣贡献,请在 Github 上发起一个 pull request。
- mjphaynes
- chrisboulton(原始端口)
- 项目贡献者