rnd-cosoft/queue-doctrine

集成Doctrine作为队列系统的Laminas框架模块

4.3.1 2024-04-05 06:40 UTC

README

Latest Stable Version Latest Unstable Version

由Stefan Kleff创建

要求

注意:需要在composer.json文件中要求 doctrine 包。

安装

运行 composer require slm/queue-doctrine

如果您已安装laminas/laminas-component-installer 包,它将要求您在Laminas和Mezzio中启用模块(和 SlmQueue)。否则,将模块添加到列表中

  • 在Laminas MVC中,通过在您的 application.config.php 文件中添加 SlmQueueDoctrine 来启用模块。
  • 在Mezzio中,通过在您的 config.php 文件中添加 SlmQueueDoctrine\ConfigProvider::class, 来启用模块。

注意:不要忘记在您配置文件中安装 SlmQueue,这是必需的。

文档

在阅读 SlmQueueDoctrine 文档之前,请先阅读 SlmQueue 文档

配置连接

您需要在服务管理器中注册一个doctrine连接,该连接将用于SlmQueueDoctrine访问数据库。以下是一些 示例

连接参数可以在应用程序配置中定义

<?php
return [
    'doctrine' => [
        'connection' => [
            // default connection name
            'orm_default' => [
                'driverClass' => 'Doctrine\DBAL\Driver\PDOMySql\Driver',
                'params' => [
                    'host'     => 'localhost',
                    'port'     => '3306',
                    'user'     => 'username',
                    'password' => 'password',
                    'dbname'   => 'database',
                ]
            ]
        ]
    ],
];

从SQL文件创建表

您必须创建所需的表,该表将包含队列。您可以使用位于 'data/queue_default.sql' 的模式。如果您更改表名,请参阅 配置队列

>mysql database < data/queue_default.sql

从Doctrine实体创建表

还有另一种方法通过将Doctrine实体 'data/DefaultQueue.php' 复制到您的实体文件夹(在我们的示例中为 'Application\Entity')并执行Doctrine的 'orm:schema-tool:update' 命令来在您的数据库中创建 'queue_default' 表。请注意,DefaultQueue 实体仅用于表创建,并在此模块内部不使用。

添加队列

return [
  'slm_queue' => [
    'queue_manager' => [
      'factories' => [
        'foo' => 'SlmQueueDoctrine\Factory\DoctrineQueueFactory'
      ]
    ]
  ]
];

添加作业

return [
  'slm_queue' => [
    'job_manager' => [
      'factories' => [
        'My\Job' => 'My\JobFactory'
      ]
    ]
  ]
];

配置队列

以下选项可以针对每个队列进行设置;

  • 连接(默认为 'doctrine.connection.orm_default'): 已注册的doctrine连接服务名称
  • table_name(默认为 'queue_default'): 用于存储作业的表名称
  • deleted_lifetime(默认为 0): 保持已删除(成功)作业的时间(以分钟为单位)
  • buried_lifetime(默认为 0): 保持已埋葬(失败)作业的时间(以分钟为单位)
return [
  'slm_queue' => [
    'queues' => [
      'foo' => [
        // ...
      ]
    ]
  ]
];

提供的工作策略

除了SlmQueue提供的策略外,SlmQueueDoctrine还提供了以下策略;

ClearObjectManagerStrategy

此策略将在执行单个作业之前清除ObjectManager。作业必须实现DoctrineModule\Persistence\ObjectManagerAwareInterfaceSlmQueueDoctrine\Persistence\ObjectManagerAwareInterface

监听

  • process.job事件,优先级1000

选项

此策略默认启用。

IdleNapStrategy

当队列中没有可用的作业时,此策略将使工作进程等待特定的时间后再查询数据库。

监听

  • process.idle 事件,优先级为1

选项

  • nap_duration 默认为1(秒)

此策略默认启用。

对队列的操作

push

有效选项包括

  • scheduled: 作业下次计划运行的时间
    • 数字字符串或整数 - 解释为时间戳
    • 可由 DateTime 对象解析的字符串
    • DateTime 实例
  • delay: 作业变为可弹出之前的时间延迟(默认为0 - 无延迟 -)
    • 数字字符串或整数 - 解释为秒
    • 可由 DateTimeInterval::__construct 解析的(ISO 8601持续时间)字符串
    • 可由 DateTimeInterval::createFromDateString 解析的(相对部分)字符串
    • DateTimeInterval 实例
  • priority: 优先级越低,作业越早从队列中弹出(默认为1024)

示例

// scheduled for execution asap
$queue->push($job);

// will get executed before jobs that have higher priority
$queue->push($job, [
    'priority' => 200,
]);

// scheduled for execution 2015-01-01 00:00:00 (system timezone applies)
$queue->push($job, [
    'scheduled' => 1420070400,
]);

// scheduled for execution 2015-01-01 00:00:00 (system timezone applies)
$queue->push($job, [
    'scheduled' => '2015-01-01 00:00:00'
]);

// scheduled for execution at 2015-01-01 01:00:00
$queue->push($job, [
    'scheduled' => '2015-01-01 00:00:00',
    'delay' => 3600
]);

// scheduled for execution at now + 300 seconds
$queue->push($job, [
    'delay' => 'PT300S'
]);

// scheduled for execution at now + 2 weeks (1209600 seconds)
$queue->push($job, [
    'delay' => '2 weeks'
]);

// scheduled for execution at now + 300 seconds
$queue->push($job, [
    'delay' => new DateInterval("PT300S"))
]);

工作进程动作

从您的 Laminas Framework 2 应用程序的公共文件夹中,通过命令行与工作进程进行交互

启动工作进程

启动一个工作进程,该工作进程将监控特定队列中计划处理的作业。该工作进程将继续运行,直到达到某些标准(超过内存限制或处理了指定的作业数量)。

vendor/bin/laminas slm-queue:start <队列名称>

当工作进程完成当前正在处理的作业后,您可以通过按下 cntr-C 之后 退出工作进程。(PHP 在 Windows 上不支持信号处理)

恢复作业

要恢复长时间处于 '运行' 状态(以分钟为单位指定)的作业,请使用以下命令。

vendor/bin/laminas slm-queue:doctrine:recover <队列名称> [--executionTime=]

注意:正在处理正在恢复的作业的工作进程不会被停止。