zorac/php-resque

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

2.12.3 2023-07-03 16:14 UTC

README

Software license PHP version Latest release Build status

Resque是一个基于Redis的后台任务库,用于创建后台任务、将任务放置在多个队列中并在稍后处理它们。

请参阅变更日志升级指南

背景

本版本的php-resque是基于php-resque-ex的分支,而php-resque-ex又是基于chrisboulton的原始php-resque的分支。有关更多信息,请参阅原始README

此分支还切换到Predis作为后端,并更新为使用命名空间代码,以及从最新的php-resque回滚一些其他功能。

注意。保持完全向后兼容(除了Redis中的数据格式外)不是此分支的目标。主要版本升级将包含破坏性更改。可能在次要版本升级中删除对已停止使用的PHP版本的支持。

附加功能

此分支提供了一些附加功能

Predis支持

此端口使用Predis与其后端Redis连接。

强大的日志记录

您可以直接将日志记录到数据库,而不是将STDOUT输出重定向到文件,或者通过套接字将它们发送到其他地方。我们使用Monolog来管理所有日志。请参阅他们的文档以查看所有可用的处理器。

日志条目增加了更多信息,并与一个工作进程、一个队列以及如果有,一个作业ID相关联。

作业创建委托

现代方法

创建一个实现Resque\Job\CreatorInterface的类,并将其注入到工作进程中,例如。

$worker = new Resque\Worker($queues);
$creator = new My\Creator();
$worker->setCreator($creator);

传统方法

如果存在Resque_Job_Creator类,并且被Resque找到,所有作业的创建都将委托给此类。

将此类注入的最佳方式是将其包含在您的APP_INCLUDE文件中。

类内容是

class Resque_Job_Creator
{
    /**
     * Create a new Resque Job.
     *
     * @param string $className Your job class name, the second argument when
     *      enqueuing a job.
     * @param array<mixed> $args The arguments passed to your job.
     */
    public static function createJob($className, $args) {
        return new $className();
    }
}

这在您的自动加载器无法加载类时非常有用,例如当类名与其文件名不匹配时。一些框架,如CakePHP,使用PluginName.ClassName约定进行类名,并且在加载之前需要特殊处理。

失败的作业日志

您可以轻松地从redis数据库中检索失败的作业的日志,它们的键以它们的作业ID命名。每个失败的日志条目将在两周后过期以节省空间。

高级队列过滤

队列名称可以包含通配符字符*,这将导致工作进程检索所有队列的列表,并以随机顺序处理所有匹配的队列。每个*可以匹配零个或多个字符;您可以有多个通配符,并且特别地,一个只有*的队列名称将匹配所有队列。此外,您可以通过在名称前加上!来排除队列;这些排除模式也可以包含通配符,并且可以出现在队列列表的任何位置。排除只影响通配符模式。

例如,如果队列设置如下

QUEUES="system:high,*:high,*,system:low,!*:low"

则工作进程将按以下顺序处理队列

  1. system:high
  2. 所有以:high结尾的其他队列,以随机顺序。
  3. 所有不以:low结尾的其他队列,以随机顺序。
  4. system:low

增强型优雅关闭

默认的优雅关闭过程(通过向工作进程发送SIGTERM触发)将在强制使用SIGKILL杀死子进程之前等待$worker->gracefulDelay秒(默认为五秒)。这将允许短运行的任务完成,同时仍然允许工作进程以合理的时间退出。

如果您希望工作能够优雅地关闭自己,例如确保即使在任务被提前终止的情况下也能执行日志记录或清理,则可以将$worker->gracefulSignal设置为要发送的信号而不是SIGKILL。在额外的延迟$worker->gracefulDelayTwo秒(默认为两秒)后,将向子进程发送最后的杀死信号,并退出工作进程。

安装

最简单的方法是使用composer,在您的composer.json中添加以下内容

    "require": {
        "zorac/php-resque": "^2.0"
    }

警告

php-resque需要pcntl php扩展,在Windows平台不可用。如果在Windows机器上尝试安装此包,Composer安装将失败。如果您仍然想冒险继续安装,请使用带有--ignore-platform-reqs选项的composer install命令。

用法

日志记录

使用与原始端口相同的方式,并添加额外的ENV

  • LOGHANDLER:指定用于日志记录的处理程序(文件、MongoDB、套接字等)。有关所有可用处理程序的信息,请参阅Monolog文档。LOGHANDLER是处理程序名称,不包含"处理程序"部分。要使用CubeHandler,只需键入"Cube"。
  • LOGHANDLERTARGET:处理程序用于连接数据库的信息。取决于日志处理程序的类型。如果是RotatingFileHandler,目标将是文件名。如果是CubeHandler,目标将是UDP地址。请参阅每个处理程序以了解其__construct()方法所需的参数类型。
  • LOGGING:必须设置此环境变量才能通过Monolog启用日志记录。例如:LOGGING=1

如果这两个环境变量之一缺失,则默认为RotatingFile处理程序。

Redis后端

  • REDIS_BACKEND:Redis数据库的主机名或Predis DSN
  • REDIS_DATABASE:选择另一个Redis数据库(默认为0)
  • REDIS_NAMESPACE:为键设置不同的命名空间(默认为resque

要求

  • PHP 7.2+
  • Redis 2.2+

贡献者