php-resque/resque

此软件包已被废弃,不再维护。作者建议使用resque/php-resque软件包。

基于Redis的后台任务库,用于创建后台任务并在稍后处理它们。基于Ruby resque。

dev-master 2015-11-12 00:06 UTC

This package is not auto-updated.

Last update: 2022-02-01 12:52:08 UTC


README

PHP Resque是一个Redis后端库,用于创建后台任务,将这些任务放入队列,并在未来某个时间处理它们。

构建状态: Build Status

背景

Resque是由GitHub的优秀团队开创并开发的,用Ruby编写。你在这里看到的是Resque工作进程和入队系统的PHP端口。

有关Resque的更多信息,请访问官方GitHub项目:https://github.com/resque/resque

此PHP端口提供了与Ruby版本相同的功能

  • 工作进程可以在多台机器之间分布式部署
  • 包括对优先级(队列)的支持
  • 具有内存泄漏恢复能力(分叉)
  • 期望失败
  • 自定义失败后端
  • 能够出队任务
  • 生命周期事件

它还支持以下附加功能

  • 当分叉的子进程运行任务时未能干净退出,将任务标记为失败
  • 在适当的情况下使用Redis事务
  • 避免单例

要求

  • PHP 5.4+
  • Redis 2.2+
  • Composer

入门

使用php-resque最简单的方法是将其作为Composer包安装到你的项目中。

如果你不熟悉Composer,请参阅https://getcomposer.org.cn/

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

composer require php-resque/resque:dev-master

任务

入队任务

任务的入队方式如下

$resque = new Resque\Component\Core\Resque(/* predis connection */);
$resque->enqueue('default', 'Acme\My\Job', array('name' => 'Chris'));

这假设你对默认内部结构满意。

定义任务

每个任务应在其自己的类中,并实现Resque\Component\Job\PerformantJobInterface接口。

namespace Acme\My;

use Resque\Component\Job\PerformantJobInterface;

class Job implements PerformantJobInterface
{
    public function perform($args)
    {
        // Work work work
        echo $args['name'];
    }
}

任务抛出的任何异常都会导致任务失败 - 请在此处小心,并确保你处理了不应该导致任务失败的那些异常。

出队/删除任务

队列允许你以下方式从其中删除任务

// Simply remove it by a job id
$queue->remove(array('id' => $job->getId()));
// remove jobs by matching the class
$queue->remove(array('class' => 'Acme/Job'));

如果没有提供删除过滤器,则不删除任何任务。但是,你可以使用以下方式删除队列中的所有任务以及队列本身

$queue->deregister();

删除和注销都返回已删除的任务数量。

跟踪任务状态

php-resque 具有执行队列作业基本状态跟踪的能力。状态信息将允许您检查作业是否在队列中、是否正在运行、是否已完成或是否失败。

要跟踪作业的状态,请将 true 作为 Resque::enqueue 的第四个参数传递。将返回用于跟踪作业状态的令牌。

$token = Resque::enqueue('default', 'My_Job', $args, true);
echo $token;

要获取作业的状态

$status = new Resque_Job_Status($token);
echo $status->get(); // Outputs the status

作业状态由 Resque_Job_Status 类中的常量定义。有效的状态包括

  • Resque_Job_Status::STATUS_WAITING - 作业仍在队列中
  • Resque_Job_Status::STATUS_RUNNING - 作业正在运行
  • Resque_Job_Status::STATUS_FAILED - 作业已失败
  • Resque_Job_Status::STATUS_COMPLETE - 作业已完成
  • false - 获取状态失败 - 令牌是否有效?

作业完成或失败后,状态最多可用24小时,然后自动过期。也可以通过在状态类上调用 stop() 方法强制使状态过期。

工作进程

工作进程与 Ruby 工作进程几乎以相同的方式工作。有关工作进程的完整文档,请参阅原始文档。

包含一个基本的“启动并运行”的 bin/resque 文件,用于设置运行工作进程的环境。(通过 Composer 安装时为 vendor/bin/resque

与 Ruby 版本的 resque 相似之处的一个例外是如何最初设置工作进程。为了在所有环境中工作,而不仅仅是 Ruby 中那样有一个单一的环境,PHP 版本在依赖 composer 之外,不假定您的设置。

要启动工作进程,它与 Ruby 版本非常相似

$ QUEUE=file_serve bin/resque

您需要负责告诉工作进程要包含哪个文件以开始您的应用程序。您可以通过设置 APP_INCLUDE 环境变量来完成此操作

$ QUEUE=file_serve APP_INCLUDE=../application/init.php bin/resque

开始应用程序还包括通过自动加载器或包含它们来告诉工作进程您的作业类。

或者,您始终可以从应用程序中 include('bin/resque') 并完全跳过设置 APP_INCLUDE。只需确保在这样做之前设置了各种环境变量(setenv)即可。

日志记录

端口支持用于将日志记录到 STDOUT 的相同环境变量。设置 VERBOSE 将打印基本调试信息,而 VVERBOSE 将打印详细信息。

$ VERBOSE=1 QUEUE=file_serve bin/resque
$ VVERBOSE=1 QUEUE=file_serve bin/resque

优先级和 RedisQueue 列表

同样,优先级和队列列表功能与 Ruby 工作进程完全相同。多个队列应使用逗号分隔,并且它们提供的顺序是它们检查的顺序。

按照原始示例

$ QUEUE=file_serve,warm_cache bin/resque

在检查 warm_cache 队列之前,将始终在每个迭代中检查 file_serve 队列以查找新作业。

运行所有队列

所有队列都以相同的方式受支持,并按字母顺序处理

$ QUEUE='*' bin/resque

运行多个工作进程

可以通过提供 COUNT 环境变量同时启动多个工作进程

$ QUEUES=emails COUNT=5 bin/resque

但是,请注意,每个工作进程都是其自己的分支,并且一旦它产生了 COUNT 个分支,原始进程就会关闭。如果您需要使用外部应用程序(如 monit)跟踪您的作业,您将需要解决这个问题。

自定义前缀

当您有多个应用程序使用相同的 Redis 数据库时,最好使用自定义前缀来分隔 Resque 数据。

$ PREFIX=my-app-name bin/resque

分支

与Ruby版本类似,支持的平台上,在获取任务后,会立即分支。分支的子进程在任务完成后将立即退出。

与php-resque的不同之处在于,如果分支的子进程没有干净地退出(PHP错误等),php-resque将自动失败该任务。

信号

信号在支持的平台上的工作方式与Resque的Ruby版本完全相同。

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

进程标题/状态

Ruby版本的Resque有一个非常实用的功能,即更新工作进程的进程标题以指示工作进程正在做什么,任何分支的子进程也将设置其进程标题,以显示正在运行的作业。这有助于识别服务器上运行的过程及其Resque状态。

PHP默认情况下直到5.5版本都没有这项功能。

存在一个PECL模块(http://pecl.php.net/package/proctitle),在5.5版本之前将此功能添加到PHP中。因此,如果您想更新进程标题,请安装此PECL模块。php-resque将自动检测并使用它。

事件系统

php-resque附带了一个基本的事件系统,您可以使用它来编写应用程序。但是,建议您将桥接器连接到应用程序的事件系统

在提供的分发器中,您可以通过注册可调用对象来监听事件(如下所示),这些可调用对象将在事件被触发时执行。

// @see Resque\Component\Core\Event\EventDispatcher
$dispatcher->addListener('eventName', [callback]);

[回调]可以是PHP中的任何可调用对象

事件对象作为单一参数传递(如下所述)。

您可以通过调用EventDispatcher->removeListener来停止监听事件,该调用与EventDispatcher->addListener提供的相同参数。

事件

在php-resque中,每个事件都是一个具有名称的对象,根据情况可能具有其他属性。以下列表显示了每个事件名称及其相应的对象。所有事件对象至少将实现Resque\Event\EventInterface接口。

resque.worker.start_up

@see Resque\Component\Worker\Event\WorkerEvent

在作为工作进程初始化时触发一次。传入的参数是刚刚初始化的Worker实例。

resque.worker.before_fork

@see Resque\Event\WorkerBeforeForkEvent

Resque\Component\Worker\Worker分支以运行任务之前触发。事件包含即将执行的任务的WorkerResque\Component\Job\Model\Job

resque.job.before_fork父进程中触发。对所做的任何更改都将对工作进程的生命周期永久有效。

resque.worker.after_fork

@see Resque\Event\WorkerAfterForkEvent

由子进程触发,在 Resque\Component\Worker\Worker 分叉以运行一个任务之后(但在任务运行之前)。事件包含即将执行的 WorkerResque\Component\Job\Model\Job

注意: resque.job.before_fork 在分叉出子进程以完成任务后,在 子进程 中触发。所做的任何更改都只会在 任务 处理期间有效。

resque.job.before_perform

@see Resque\Event\JobBeforePerformEvent

在调用任务的 perform 方法之前触发。事件包含即将执行的 Resque\Component\Job\Model\Job 实例和将要调用 perform 方法的目标类实例。

抛出的任何异常都将被视为在任务中抛出,导致任务被标记为失败。

resque.job.after_perform

@see Resque\Event\WorkerAfterForkEvent

在任务成功执行后立即触发。事件包含 Resque\Component\Job\Model\Job 实例和刚刚执行的目标类实例。

抛出的任何异常都将被视为在任务中抛出,导致任务被标记为失败。

resque.job.failed

@see Resque\Component\Job\Event\JobFailedEvent

每当任务执行失败时触发。即当任务抛出异常,或者当 Worker 的子进程无法干净地退出时。

事件包含以下内容

  • Resque\Component\Job\Model\Job 刚刚失败的作业。
  • Resque\Component\Worker\Worker 刚刚失败的作业所在的 Worker。
  • \Exception 当作业失败时抛出的异常,如果有的话。

afterEnqueue

使用 Resque::enqueue 方法将作业排队后调用。传递的参数(按此顺序)包括

  • 类 - 包含计划作业名称的字符串
  • 参数 - 传递给作业的参数数组
  • RedisQueue - 包含作业被添加到的队列名称的字符串
  • ID - 包含已排队作业的新令牌的字符串

Dispatcher Replacement

// @todo 记录使用说明