klevialent / tarantool-queue-php
tarantool queue php
Requires
- php: >=5.6.0
- rybakit/msgpack: ^0.2.1
- tarantool/client: ^0.2.0
- tarantool/queue: ^0.3.0
This package is auto-updated.
Last update: 2024-09-24 13:56:01 UTC
README
兼容 php7。
使用
tarantool-php/client
tarantool-php/queue
Tarantool 是一个在 Lua 应用服务器中运行的 NoSQL 数据库。它集成了 Lua 模块,称为 LuaRocks。此包提供了 Tarantool Queue LuaRock 的 PHP 绑定。
安装
推荐通过 Composer 安装库
$ composer require klevialent/tarantool-queue-php
QueueProcessController 只与 yii2 兼容,如果您想使用它
$ composer require yiisoft/yii2
开始前
为了使用队列,您首先需要确保您的 Tarantool 实例已配置、启动并运行。所需的最小配置可能如下所示
-- queues.lua box.cfg {listen=3301} queue = require('queue') queue.start() queue.create_tube('foobar', 'fifo', { if_not_exists=true })
您可以在官方的 Tarantool 文档 中了解有关 box 配置的更多信息。有关队列配置的更多信息,请查看 队列的 README。
要启动实例,您需要将 queues.lua
文件复制(或创建符号链接)到 /etc/tarantool/instances.enabled
目录,并运行以下命令
$ sudo tarantoolctl start queues
与队列一起工作
请参阅示例-yii 或阅读更多。
$queue = Yii::$app->queue->foobar;
ProsessQueue
实现 WorkerInterface 的 process() 方法并将其作为守护进程运行。
如果您使用 yii2
//add to config
'controllerMap' => [
'queue-process' => WebDevTeam\TarantoolQueuePhp\QueueProcessController::className(),
],
//console command
php yii queue-process foobar
数据类型
在内部,Tarantool 使用 MessagePack 二进制格式来序列化和反序列化存储在队列中的数据。这意味着可以安全地使用诸如 null
、bool
、int
、float
、string
、binary string
和 array
这样的数据类型,而无需任何手动预处理或后处理
$queue->put('foo'); $queue->put(true); $queue->put(42); $queue->put(4.2); $queue->put(['foo' => ['bar' => ['baz' => null]]]);
任务
Task::getId() Task::getState() // States::READY, States::TAKEN, States::DONE, States::BURY or States::DELAYED Task::getData()
还有一些糖方法
Task::isReady() Task::isTaken() Task::isDone() Task::isBuried() Task::isDelayed()
生产者 API
如您所见,要将任务插入队列,您需要调用 put()
方法,该方法接受两个参数:您想要处理的数据和可选的任务选项数组,该队列支持这些选项。例如,fifottl
队列(我们在 Lua 配置文件中之前定义的),支持 delay
、ttl
、ttr
、pri
和 temporary
选项
$queue->put('foo', ['delay' => 30]); $queue->put('bar', ['ttl' => 5]); $queue->put('baz', ['ttr' => 10, 'pri' => 42]);
请在此处查看完整选项列表 这里。
消费者 API
要为执行保留任务,请调用 take()
方法。它接受一个可选的 timeout
参数。如果提供了超时值,则调用将等待 timeout
秒,直到队列中出现 READY
任务。该方法返回一个 Task 对象或 null
$task = $queue->take(); // wait 2 seconds $task = $queue->take(2); // wait 100 milliseconds $task = $queue->take(.1);
执行成功后,可以将任务标记为已确认(这将同时从队列中删除任务)
$data = $task->getData(); // process $data $task = $queue->ack($task->getId());
或将任务放回队列中,如果无法执行
$task = $queue->release($task->getId()); // for ttl-like queues you can specify a delay $task = $queue->release($task->getId(), ['delay' => 30]);
要查看任务而不更改其状态,请使用
$task = $queue->peek($task->getId());
要埋葬(禁用)任务
$task = $queue->bury($task->getId());
要将埋葬的任务重置回 READY
状态
$count = $queue->kick(3); // kick 3 buried tasks
可以永久删除任何状态的任务,使用 delete()
$task = $queue->delete($task->getId());
要删除队列中的所有任务
$queue->truncate();
有关详细的 API 文档,请阅读 使用队列模块 的部分 队列的 README。
统计信息
《stats()` 方法提供访问自队列创建以来累积的统计信息的功能
$stats = $queue->stats();
这次调用的结果可能如下所示
[ 'tasks' => [ 'taken' => 1, 'buried' => 1, 'ready' => 1, 'done' => 0, 'delayed' => 0, 'total' => 3, ], 'calls' => [ 'bury' => 1, 'put' => 3, 'take' => 1, ... ], ]
此外,您可以指定一个键来只返回数组的子集
$calls = $queue->stats('calls'); $total = $queue->stats('tasks.total');