daanbiesterbos / job-queue-bundle
允许运行和安排 Symfony 控制台命令作为后台作业。
Requires
- php: >=7.3
- doctrine/doctrine-bundle: ^2
- symfony/debug: ^4.4
- symfony/form: ^4.4
- symfony/framework-bundle: ^4.4
- symfony/intl: ^4.4
- symfony/process: ^4.4
- symfony/twig-bundle: ^4.4
- symfony/validator: ^4.4
Requires (Dev)
- doctrine/doctrine-fixtures-bundle: ^3.4
- friendsofphp/php-cs-fixer: ^2.18
- phpunit/phpunit: ^7|^8
- symfony/browser-kit: ^4.4
- symfony/css-selector: ^4.4
- symfony/finder: ^4.4
- symfony/yaml: ^4.4
Suggests
- symfony/twig-bundle: Required when using the webinterface.
Replaces
- jms/job-queue-bundle: ^2.1
This package is auto-updated.
Last update: 2024-09-19 20:03:22 UTC
README
安装
composer require daanbiesterbos/job-queue-bundle
注册 Bundle
将 Bundle 添加到 bundles.php
JMS\JobQueueBundle\JMSJobQueueBundle::class => ['all' => true],
准备控制台可执行文件
将 bin/console
复制到 bin/job-queue
并使用 JMSJobQueueBundle 应用程序代替标准的 Symfony 应用程序。
# # Copy the console executable # cp bin/console bin/job-queue # # Open bin/job-queue in a text editor # # Look for this line: # use Symfony\Bundle\FrameworkBundle\Console\Application; # # And change it to: # use JMS\JobQueueBundle\Console\Application; vim bin/job-queue
注意:这是原始 Bundle 的一部分。我更希望有一个不需要额外控制台的更好解决方案。然而,考虑到分支的目的,当前更注重向后兼容性。
用法
创建作业
创建作业很简单,只需持久化 Job
实例即可。
$em->persist($job); $em->flush($job);
在作业之间添加依赖关系
如果您希望某个作业在另一个作业完成后运行,也可以轻松实现这一点。
$job->addDependency($job); $em->persist($job); $em->persist($dependentJob); $em->flush();
安排作业
如果您想安排一个作业
$job->add(new DateInterval('PT30M')); $job->setExecuteAfter($date); $em->persist($job); $em->flush();
通过队列实现细粒度并发控制
如果您想更好地控制特定作业类型的并发性,可以使用队列:队列允许您强制更严格的限制,限制每个队列中运行的作业数量。默认情况下,每个队列中作业的数量没有限制,因此此类队列将没有效果(作业将按照创建的顺序处理)。要为队列定义限制,可以使用 Bundle 的配置。
jms_job_queue: queue_options_defaults: max_concurrent_jobs: 3 # This limit applies to all queues (including the default queue). # So each queue may only process 3 jobs simultaneously. queue_options: foo: max_concurrent_jobs: 2 # This limit applies only to the "foo" queue.
**注意**:队列设置适用于每个 jms-job-queue:run
命令的单独实例。无法指定所有实例的全局限制。
优先级作业
默认情况下,所有作业都按它们安排的顺序执行(假设它们在同一个队列中)。如果您想在同一队列中优先执行某些作业,可以设置优先级。
$job = new Job('a', array(), true, Job::DEFAULT_QUEUE, Job::PRIORITY_HIGH); $em->persist($job); $em->flush();
优先级是一个简单的整数 - 数值越高,作业执行得越早。
安排的作业 - JMSJobQueueBundle 文档
此 Bundle 还允许您有安排的作业,它们在特定的时间间隔内执行。这可以通过在您的命令中实现 JMSJobQueueBundleCommandCronCommand
或在服务中实现 JMSJobQueueBundleCronJobScheduler
并使用 jms_job_queue.scheduler
标签来实现。作业随后通过作为额外后台进程运行的 jms-job-queue:schedule
命令进行安排。您还可以运行多个此命令的实例,以确保高可用性并避免单点故障。
实现 CronCommand
class MyScheduledCommand extends Command implements CronCommand { // configure, execute, etc. ... public function shouldBeScheduled(DateTime $lastRunAt) { return time() - $lastRunAt->getTimestamp() >= 60; // Executed at most every minute. } public function createCronJob(DateTime $lastRunAt) { return new Job('my-scheduled-command'); } }
对于常见的间隔,您还可以使用提供的特性之一。
class MyScheduledCommand extends ContainerAwareCommand implements CronCommand { use ScheduleEveryMinute; // ... }
实现 JobScheduler
如果您想通过此 Bundle 将第三方命令或 Symfony 命令作为安排的命令运行,这很有用。
class MyJobScheduler implements JobScheduler { public function getCommands(): array { return ['my-command']; } public function shouldSchedule($commandName, DateTime $lastRunAt) { return time() - $lastRunAt->getTimestamp() >= 60; // Executed at most every minute. } public function createJob($commandName, DateTime $lastRunAt) { return new Job('my-command'); } }
链接
- 文档: Github 仓库
- 许可: LICENSE
- 分支自: JMSJobQueueBundle