moharram82 / queue
Queue 是一个用于在后台执行耗时任务的 PHP 包。
v2.0.0
2024-03-07 08:24 UTC
Requires
- php: >=8.1
- ext-json: *
- ext-pdo: *
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 来添加更多驱动程序。