mjphaynes / php-resque
基于Redis的后端库,用于创建后台任务并在稍后处理它们。
Requires
- php: >=7.1.0
- ext-pcntl: *
- monolog/monolog: ~1.7
- predis/predis: 1.1.*
- symfony/console: ~3.0|~4.0|~5.0
- symfony/yaml: ~3.0|~4.0|~5.0
Requires (Dev)
- phpunit/phpunit: ~4.8
- symfony/process: ~3.0|~4.0|~5.0
Suggests
- ext-phpiredis: Native PHP extension for Redis connectivity. Predis will automatically utilize when available.
- symfony/process: To run the speed test command.
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
异常,任务将被标记为已取消。
作业还可以有setUp
和tearDown
方法。如果定义了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
命令接受内联配置选项,并从配置文件中读取。
例如,要指定工作进程只处理名为high
和low
的队列上的作业,以及允许作业的最大内存为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上发出拉取请求。
- mjphaynes
- chrisboulton(原始端口)
- 项目贡献者