mjphaynes/php-resque

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

3.1.1 2023-01-31 07:35 UTC

This package is auto-updated.

Last update: 2024-09-07 11:08:11 UTC


README

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

内容

背景

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

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

本版本提供以下功能:

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

本版本不是直接从GitHub的Resque移植的,因此与它或其Web界面不兼容。 本版本的Resque Web界面是用Symfony 3.x构建的,可在GitHub上找到:https://github.com/xelan/resque-webui-bundle/

要求

要运行php-resque,您必须安装以下软件

可选

入门

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

通过以下命令将php-resque添加到您的应用程序中

composer require mjphaynes/php-resque

如果您尚未这样做,请将Composer自动加载器添加到项目的引导文件中

require 'vendor/autoload.php';

任务

定义任务

每个任务都应该在一个类中,php-resque为它们提供了一个构建蓝图。

use Resque\Blueprint\Job as JobBlueprint;
use Resque\Job;

class MyJob extends JobBlueprint
{
    /**
     * Runs any required logic before the job is performed.
     *
     * @param Job $job Current job instance
     */
    public function setUp(Job $job): void
    {
    }

    /**
     * Actual job logic.
     *
     * @param array $args Arguments passed to the job
     * @param Job   $job  Current job instance
     */
    public function perform(array $args, Job $job): void
    {
        // Do some work
    }

    /**
     * Runs after the job is performed.
     *
     * @param Job $job Current job instance
     */
    public function tearDown(Job $job): void
    {
    }
}

当运行任务时,将实例化该类,并将任何参数作为参数传递给perform方法。当前任务实例(Resque\Job)作为第二个参数传递给perform方法。

任务抛出的任何异常都会导致任务失败 - 在这里要小心,并确保您处理了不应导致任务失败的异常。如果您想取消任务(而不是使其失败),则可以抛出Resque\Exception\Cancel异常,任务将被标记为已取消。

作业还可以有setUptearDown方法。如果定义了setUp方法,它将在执行方法运行之前被调用。如果定义了tearDown方法,它将在作业完成后被调用。如果在setUp方法中抛出异常,则不会执行执行方法。这对于具有相同引导程序的不同作业非常有用,例如数据库连接。

排队任务

要向队列中添加新的作业,请使用Resque::push方法。

$job = Resque::push(MyJob::class, ['arg1' => true, '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::class, [], 'email');

延迟任务

可以使用Resque::later方法安排在未来的指定时间运行的作业。您可以通过传递一个整数或一个DateTime对象来实现。

$job = Resque::later(60, MyJob::class);
$job = Resque::later(1398643990, MyJob::class);
$job = Resque::later(new \DateTime('+2 mins'), MyJob::class);
$job = Resque::later(new \DateTime('2014-07-08 11:14:15'), MyJob::class);

如果传递一个整数且它小于94608000秒(3年),php-resque将假设您想要一个相对于当前时间的时间(毕竟,谁会延迟超过3年的作业呢?)。请注意,必须有一个在指定时间运行的工作进程才能运行作业。

任务状态

php-resque跟踪作业的状态。状态信息将允许您检查作业是否在队列中,当前正在运行、失败等。要跟踪作业的状态,您必须捕获已推送作业的作业ID。

$job = Resque::push(MyJob::class);
$jobId = $job->getId();

要获取作业的状态

$job = Job::load($jobId);
$status = $job->getStatus();

作业状态是在作业类中定义的常量。有效的状态有

  • Job::STATUS_WAITING - 作业仍在队列中
  • Job::STATUS_DELAYED - 作业已延迟
  • Job::STATUS_RUNNING - 作业正在运行
  • Job::STATUS_COMPLETE - 作业已完成
  • Job::STATUS_CANCELLED - 作业已被取消
  • Job::STATUS_FAILED - 作业已失败
  • false - 获取状态失败 - ID是否有效?

作业完成后或失败后,状态信息最多可用7天,然后自动过期。此超时可以在配置文件中更改。

工作进程

要启动工作进程,请导航到您的项目根目录并运行

$ vendor/bin/resque worker:start

请注意,一旦启动了此工作进程,它将一直运行,直到手动停止。您可以使用进程监控程序(如Supervisor)将工作进程作为后台进程运行,并确保工作进程不会停止运行。

如果工作进程是后台任务,您可以使用以下命令停止、暂停和重新启动工作进程

$ vendor/bin/resque worker:stop
$ vendor/bin/resque worker:pause
$ vendor/bin/resque worker:resume

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

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

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

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

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

此外,如果工作进程在不同的主机上运行,可以通过Redis中的数据远程触发工作进程的优雅关闭。例如

foreach(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)。

自动加载任务类

要启动您的应用程序,还需要告诉工作进程关于您的作业类的信息,可以使用自动加载器或包含它们。如果您使用Composer,则在那里添加作业类相对简单。

或者,您可以在resque.yml文件中这样做,或者通过设置包含参数。

$ vendor/bin/resque worker:start --include=/path/to/your/include/file.php

该项目的examples/文件夹中有一个如何实现此功能的示例。

命令 & 选项

有关php-resque命令及其相关参数的完整列表,请参阅命令文档

日志记录

php-resque与Monolog集成,这提供了广泛的日志记录能力。有关完整文档,请参阅日志记录文档

事件/钩子系统

php-resque具有广泛的事件/钩子系统,允许开发人员在不修改任何核心文件的情况下深入了解库。有关完整文档和事件列表,请参阅钩子文档

配置选项

有关所有配置选项的完整列表,请参阅配置文档

Redis

您可以在行内或在配置文件中设置Redis连接详细信息。在运行命令时设置

$ vendor/bin/resque [command] --host=<hostname> --port=<port>

贡献

PHP-Resque v4适用于PHP 7.2或更高版本,新代码必须与PHP 7.2兼容。尽可能遵循PSR-12编码风格。新功能应附带测试。

贡献者

为项目做出贡献将对维护和扩展脚本有很大帮助。如果您有兴趣做出贡献,请在GitHub上发出拉取请求。