moharram82/queue

Queue 是一个用于在后台执行耗时任务的 PHP 包。

v2.0.0 2024-03-07 08:24 UTC

This package is auto-updated.

Last update: 2024-09-07 09:33:54 UTC


README

简介

这是一个用于在后台执行耗时任务的 PHP 队列包。

要求

  • PHP 8.1+
  • MySQL 5.6+(数据库驱动程序)

安装与配置

  • 使用 composer 安装
composer require moharram82/php-queue
  • 通过执行 table.sql 文件创建队列表
  • 实例化一个新的 \Moharram82\Queue\QueueConfig 对象,它接受一个可选的配置数组。
$config = new \Moharram82\Queue\QueueConfig([
    'queue' => 'default',
    'retry_after' => 90, // in seconds
    'table' => 'queues', // database driver table name
]);
  • 实例化一个 \Moharram82\Queue\QueueInterface 的实现驱动实例,例如 \Moharram82\Queue\MySQLQueue
$database_connection_options = [
    'host' => '127.0.0.1',
    'username' => 'root',
    'password' => '',
    'database' => 'queue',
    'port' => 3306,
];

// create PDO database connection, which is required by `\Moharram82\Queue\MySQLQueue` as first parameter
try { 
    $connection = new PDO(
        "mysql:host={$database_connection_options['host']};dbname={$database_connection_options['database']};port={$database_connection_options['port']};charset=utf8",
        $database_connection_options['username'],
        $database_connection_options['password'],
        [
            PDO::MYSQL_ATTR_INIT_COMMAND => 'SET character_set_results=utf8',
            PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
            PDO::MYSQL_ATTR_INIT_COMMAND => 'SET character_set_client=utf8',
            PDO::MYSQL_ATTR_INIT_COMMAND => 'SET character_set_connection=utf8',
            PDO::MYSQL_ATTR_INIT_COMMAND => 'SET collation_connection=utf8_general_ci'
        ]
    );
    $connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    echo $e->getMessage();
    die;
}

// pass the connection as first optional parameter or database connection array as second optional parameter, then `\Moharram82\Queue\QueueConfig` as third optional parameter.
// keep in mind, you have to pass at least one of the first and the second parameters.
$config->setDriver(new \Moharram82\Queue\MySQLQueue($connection, [], $config));
  • 实例化一个新的 \Moharram82\Queue\QueueManager 对象
$manager = new \Moharram82\Queue\QueueManager($config);

用法

推送到队列

// create a Job class (which is a normal PHP class with a handle method) passing to it the object you want to process.

namespace Example;

class SendEmailJob
{
    public MailMessage $message;

    public function __construct(MailMessage $message)
    {
        $this->message = $message;
    }

    public function handle()
    {
        $this->message->send();
    }
}

$job = new \Example\SendEmailJob(new \Example\MailMessage());

// call the QueueManager instance's push method and pass to it the Job class object with an optional second parameter for the queue name.
$manager->push($job, 'default');

处理队列

// call the QueueManager instance's run method.
// You can call the `run` method from a cron job or supervisor process.
$manager->run('default');

示例

请检查 example 目录以获取推送和处理队列的示例脚本。

扩展队列

你可以通过扩展抽象类 \Moharram82\Queue\Queue 并实现接口 \Moharram82\Queue\QueueInterface 来添加更多驱动程序。