francislavoie/php-resque

Redis支持的库,用于创建后台任务并在以后处理它们。

1.3.0 2016-01-22 15:08 UTC

This package is auto-updated.

Last update: 2024-09-19 02:27:24 UTC


README

php-resque(发音为“rescue”)是一个Redis支持的库,用于创建后台任务,将任务放入多个队列,并在以后处理它们。

内容

背景

此版本的php-resque基于chrisboulton最初的工作,他在那里将同名ruby版本移植到GitHub

重写以前工作的原因是为了添加对工作者服务器水平扩展的更好支持,并提高任务失败容忍度,以创建一个非常高可用性的系统。与Monolog的集成意味着可以实现非常详尽的日志记录,这使得解决分布式系统中的错误变得更加容易。广泛的事件/钩子系统可以实现更深入的集成和统计收集。

此版本提供以下功能:

  • 工作者可以分布在多台机器上。
  • 对内存泄漏具有弹性(任务在分叉进程中运行)。
  • 预期并记录失败。
  • 日志使用Monolog。
  • 能够将闭包推送到队列。
  • 跟踪任务状态和输出。
  • 如果超出内存或最大执行时间,任务将干净地失败。
  • 如果分叉子进程在运行任务后没有以状态码0退出,则将任务标记为失败。
  • 具有内置事件系统,以启用深度的钩子集成。
  • 支持优先级(队列)。

此版本不是GitHub的Resque的直接移植,因此与它不兼容,也不与它们的Web界面兼容。 此版本的Web界面目前正在开发中,如果您想了解更多或提供帮助,请与我联系。

要求

运行php-resque之前,您必须安装以下内容

可选,但推荐

入门

与php-resque一起使用最简单的方法是将其作为Composer包安装到您的项目中。虽然Composer不是必需的,但它使生活更加容易。

将php-resque添加到应用程序的composer.json文件中

{
    "require": {
        "mjphaynes/php-resque": "2.0.*"
    }
}

导航到您的项目根目录并运行

$ 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\Exception\Cancel异常,任务将被标记为已取消。

工作也可以有setUptearDown方法。如果定义了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方法安排任务在未来的指定时间运行。您可以传递一个整数或一个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

命令接受内联配置选项,并从配置文件读取。

例如,要指定工作进程只处理名为highlow的队列上的任务,以及允许任务的最大内存为30MB,您可以运行以下命令

$ bin/resque worker:start --queue=high,low --memory=30 -vvv

请注意,这会首先检查high队列,然后是low队列,因此可以使用这种方法来方便地设置作业队列的优先级。要运行所有队列,请使用* - 这是默认值。《-vvv》启用非常详细的日志记录。要禁用任何日志记录,请使用-q标志。

有关更多命令和完整选项列表,请参阅命令文档

信号

信号在支持的平台上工作。发送给工作者的信号将产生以下效果

  • QUIT - 等待子进程完成处理然后退出
  • TERM / INT - 立即杀死子进程然后退出
  • USR1 - 立即杀死子进程但不要退出
  • USR2 - 暂停工作者,不再处理新作业
  • CONT - 恢复工作者

分叉

当php-resque运行一个作业时,它首先将进程fork到一个子进程中。这是为了如果作业失败,工作者可以检测到作业失败并将继续运行。被fork的子进程将在作业完成后立即退出。

使用php-resque必须安装PECL模块(https://php.ac.cn/manual/en/book.pcntl.php)。

进程标题

更新工作者的进程标题是有用的,因为这表明工作者正在做什么,并且任何被fork的子进程也会设置其进程标题,与正在运行的作业一起。这有助于识别服务器上运行的过程及其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请求。