slm/queue-doctrine

此包已被废弃,不再维护。未建议替代包。

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

4.4.0 2024-04-05 10:29 UTC

README

SlmQueueDoctrine

重要通知

我们决定转向使用 Symfony Messenger,因此不再维护此存储库。您可以随意将其分支并使其成为您自己的项目。

Latest Stable Version Latest Unstable Version

由 Stefan Kleff 创建

要求

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

安装

运行 composer require slm/queue-doctrine

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

  • 在 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' => [
        // ...
      ]
    ]
  ]
];

提供的 Worker 策略

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

ClearObjectManagerStrategy

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

监听

  • process.job事件,优先级为1000

选项

此策略默认启用。

IdleNapStrategy

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

监听

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

选项

  • nap_duration默认为1(秒)

此策略默认启用。

队列操作

推送

有效选项包括

  • scheduled:作业下次计划运行的日期和时间
    • 数字字符串或整数 - 解释为时间戳
    • 可以被DateTime对象解析的字符串
    • DateTime实例
  • 延迟:作业变为可弹出的延迟时间(默认为0 - 无延迟 -)
    • 数字字符串或整数 - 解释为秒
    • 可以被DateTimeInterval::__construct解析的字符串(ISO 8601持续时间)
    • 可以被DateTimeInterval::createFromDateString解析的字符串(相对部分)
    • DateTimeInterval实例
  • 优先级:优先级越低,作业从队列中弹出的越早(默认为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应用的public文件夹中通过命令行与工作进程交互

启动工作进程

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

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

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

恢复作业

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

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

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