klevialent/tarantool-queue-php

tarantool queue php

dev-master 2018-03-13 10:27 UTC

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 二进制格式来序列化和反序列化存储在队列中的数据。这意味着可以安全地使用诸如 nullboolintfloatstringbinary stringarray 这样的数据类型,而无需任何手动预处理或后处理

$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 配置文件中之前定义的),支持 delayttlttrpritemporary 选项

$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');