lucups / presque
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)
- phpunit/phpunit: ~4.8
- sami/sami: ~3.3|~4.0
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.
README
php-resque(发音为"rescue")是一个基于Redis的后台任务库,用于创建后台任务,将这些任务放置在多个队列中,并在以后处理这些任务。
内容
背景
这个版本的php-resque基于Chris Boulton最初的工作,他在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年的作业呢?)。请注意,你必须有一个在指定时间运行的工作者,以便作业能够运行。
任务状态
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天内可用,然后自动过期。此超时可以在配置文件中更改。
工作者
要启动一个工作者,请转到你的项目根目录并运行
$ bin/resque worker:start
请注意,一旦这个工作者启动,它将继续运行,直到手动停止。你可以使用进程监控程序,如Supervisor,将工作者作为后台进程运行,并确保工作者不会停止运行。
如果工作者是后台任务,你可以使用以下命令停止、暂停和重新启动工作者
$ 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
文件中这样做或设置 include 参数
$ bin/resque worker:start --include=/path/to/your/include/file.php
此项目中 examples/
文件夹中有一个如何实现所有这些的示例。
命令 & 选项
有关 php-resque 命令及其相关参数的完整列表,请参阅命令文档。
日志记录
php-resque 与 Monolog 集成,这提供了广泛的日志记录能力。有关完整文档,请参阅日志记录文档。
事件/钩子系统
php-resque 具有广泛的 events/hook 系统以允许开发人员在不修改任何核心文件的情况下与库进行深度集成。有关完整文档和所有事件的列表,请参阅hooks 文档。
配置选项
有关所有配置选项的完整列表,请参阅配置文档。
Redis
您可以在命令运行时内联设置 Redis 连接详情或在配置文件中设置。
$ bin/resque [command] --host=<hostname> --port=<port>
贡献者
为项目贡献力量将对维护和扩展脚本有极大帮助。如果您有兴趣贡献力量,请在Github上发起pull request。
- mjphaynes
- chrisboulton(原始端口)
- 项目贡献者