initphp/queue

InitPHP 队列库

1.0 2023-12-10 08:48 UTC

This package is auto-updated.

Last update: 2024-09-10 10:22:49 UTC


README

此库通过将任务排队到稍后执行,提供性能和异步处理。

composer require initphp/queue

创建任务

首先,创建业务类。以下是一个简单的示例。

require_once __DIR__ . DIRECTORY_SEPARATOR . 'vendor/autoload.php';

namespace App\Jobs;

use InitPHP\Queue\Job;

class MailJob extends Job
{
    protected string $channel = 'mailChannel';
    
    protected string $queue = 'mailQueue';
    
    public function handle(): bool
    {
        $payload = $this->getPayload();
        try {
            if (mail($payload['to'], $payload['subject'])) {
                return true;
            } else {
                return false;;
            }
        } catch (\Throwable $e) {
            return false;
        }
    }
}

使用push()方法将任务添加到队列中;

require_once __DIR__ . DIRECTORY_SEPARATOR . 'vendor/autoload.php';
$adapter = new \InitPHP\Queue\Adapters\RabbitMQAdapter('127.0.0.1', 5267, 'guest', 'guest');

$job = new App\Jobs\MailJob($adapter);

// Add Queue Job
$job->push([
    'to'        => 'to@example.com',
    'subject'   => 'Subject Mail',
]);

编写代码来处理队列中的任务。

consumer.php

require_once __DIR__ . DIRECTORY_SEPARATOR . 'vendor/autoload.php';
$adapter = new \InitPHP\Queue\Adapters\RabbitMQAdapter('127.0.0.1', 5267, 'guest', 'guest');

$adapter->handle('mailChannel', 'mailQueue');

$adapter->close();

触发消费者代码。

php consumer.php

适配器

PDO 适配器

  • PDO 扩展

要初始化 PDO 适配器,需要一个 PDO 对象和 2 个表。

$pdo = new PDO('mysql:host=localhost;port=3307;dbname=queue_db', 'root', 'root');
$adapter = new \InitPHP\Queue\Adapters\PDOAdapter($pdo, 'queue');

其中第一个表用于等待队列中的项,另一个用于有错误的任务。失败任务所在的表名称是通过在主表名称后添加 "_failed" 后缀获得的。相应地,使用以下 SQL 创建队列表。

CREATE TABLE `queue` (
        `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
        `channel` VARCHAR(255) NOT NULL,
        `queue` VARCHAR(255) NOT NULL,
        `payload` TEXT NULL DEFAULT NULL,
        `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
        `updated_at` DATETIME NULL DEFAULT NULL,
        `status` TINYINT(1) NOT NULL DEFAULT '0',
        PRIMARY KEY (`id`)
) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE INDEX `channel_queue` ON `queue` (`channel`, `queue`);

CREATE TABLE `queue_failed` (
        `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
        `queue_id` BIGINT UNSIGNED NOT NULL,
        `channel` VARCHAR(255) NOT NULL,
        `queue` VARCHAR(255) NOT NULL,
        `payload` TEXT NULL DEFAULT NULL,
        `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
        `updated_at` DATETIME NULL DEFAULT NULL,
        `status` TINYINT(1) NOT NULL DEFAULT '0',
        PRIMARY KEY (`id`)
) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

RabbitMQ 适配器

  • RabbitMQ 服务器
  • "php-amqplib/php-amqplib" 库
composer require php-amqplib/php-amqplib
$adapter = new \InitPHP\Queue\Adapters\RabbitMQAdapter('127.0.0.1', 5267, 'guest', 'guest');

参与进来

对此项目的所有贡献都将根据 MIT 许可证发布。通过提交拉取请求或报告错误、问题或功能请求,您同意遵守此版权利益放弃声明。

帮助的主要方式有两种

  • 使用问题跟踪器,以及
  • 更改代码库。

使用问题跟踪器

使用问题跟踪器来提出功能请求、报告错误和提问。这也是与项目开发者和对此解决方案感兴趣的其他人建立联系的好方法。

使用问题跟踪器来找到贡献的方法。找到一个错误或功能,在问题中说明你将承担这项工作,然后按照下面的“更改代码库”指南操作。

更改代码库

一般来说,你应该分叉此存储库,在你自己的分叉中进行更改,然后提交拉取请求。所有新代码都应该有相关的单元测试,以验证实现的功能和缺陷的存在或不存在。此外,代码应遵循项目指定的任何风格和架构指南。如果没有此类指南,则模仿现有代码库中的风格和模式。

鸣谢

许可证

版权所有 © 2022 MIT 许可证