iron-io/iron_mq

IronMQ (托管消息队列) 的客户端绑定

4.0.1 2015-07-23 21:55 UTC

README

IronMQ 是一种弹性消息队列,用于在云应用程序和系统之间管理数据和事件流。

此库使用 IronMQ API v3。

分支

如果你使用 Laravel 并且看到 "Class IronMQ not found" 错误,请将 iron_mq 版本设置为 1.* 并安装/更新依赖项。

  • 1.* - Laravel 4.0/4.1/4.2/5.0 兼容,PHP 5.2 兼容版本。没有命名空间。使用 IronMQv2 服务器(已弃用)。
  • 2.* - Laravel 5.1/5.2 兼容,PSR-4 兼容版本。带有命名空间。使用 IronMQv2 服务器(已弃用)。
  • 3.* - Laravel 4.0/4.1/4.2/5.0 兼容,PHP 5.2 兼容版本。IronMQv3。
  • 4.* - (推荐)Laravel 5.1/5.2 兼容,PSR-4 兼容版本。带有命名空间。IronMQv3。当前默认。
  • master 分支 - 与 4.* 相同

更新说明

  • 1.3.0 - 修改了 postMessagepostMessages 方法中的参数列表。请检查使用这些方法的代码。
  • 1.4.5 - 添加了 getMessagePushStatusesdeleteMessagePushStatus 方法。
  • 2.0.0 - 版本 2.0 引入了一些不兼容的更改。IronMQ 客户端最终 PSR-4 兼容,使用命名空间和 PHP 5.3 的其他功能。如果你是从之前(1.x)版本迁移的,请仔细检查 iron_mq / iron_core 类的加载方式。如果你需要一些 1.x 功能,如 .phar 存档,请使用最新的 1.x 稳定版本:https://github.com/iron-io/iron_mq_php/releases/tag/1.5.3

入门

获取凭证

要开始使用 iron_mq_php,您需要注册并获取一个 oauth 令牌。

  1. 转到 http://iron.io/ 并注册。
  2. http://hud.iron.io/tokens 获取 Oauth 令牌

--

安装 iron_mq_php

有两种方式可以使用 iron_mq_php

使用 composer

在项目目录中创建 composer.json 文件

{
    "require": {
        "iron-io/iron_mq": "2.*"
    }
}

执行 composer install(如果需要,请安装它:https://getcomposer.org.cn/download/

并使用它

require __DIR__ . '/vendor/autoload.php';

$ironmq = new \IronMQ\IronMQ();
直接使用类(强烈不推荐)
  1. src 目录中的类复制到目标目录
  2. 那里 获取 IronCore 类并将其复制到目标目录
  3. 包含它们所有。
require 'src/HttpException.php';
require 'src/IronCore.php';
require 'src/IronMQ.php';
require 'src/IronMQException.php';
require 'src/IronMQMessage.php';
require 'src/JsonException.php';

$ironmq = new \IronMQ\IronMQ();

--

配置

配置 IronMQ 的三种方式

  • 传递包含选项的数组
<?php
$ironmq = new \IronMQ\IronMQ(array(
    "token" => 'XXXXXXXXX',
    "project_id" => 'XXXXXXXXX'
));
  • 传递存储配置选项的 ini 文件名。将 sample_config.ini 重命名为 config.ini 并包含您的 Iron.io 凭证(tokenproject_id
<?php
$ironmq = new \IronMQ\IronMQ('config.json');
  • 自动 配置 搜索 - 将零个参数传递给构造函数,库将尝试在以下位置查找配置文件

    • 当前目录中的 iron.ini
    • 当前目录中的 iron.json
    • IRON_MQ_TOKENIRON_MQ_PROJECT_ID 和其他环境变量
    • IRON_TOKENIRON_PROJECT_ID 和其他环境变量
    • 用户主目录中的 .iron.ini
    • 用户主目录中的 .iron.json

--

Keystone 身份验证

通过配置文件

keystone 部分添加到您的 iron.json 文件中

{
  "project_id": "57a7b7b35e8e331d45000001",
  "keystone": {
    "server": "http://your.keystone.host/v2.0/",
    "tenant": "some-group",
    "username": "name",
    "password": "password"
  }
}

在代码中

$keystone = array(
    "server" => "http://your.keystone.host/v2.0/",
    "tenant" => "some-gorup",
    "username" => "name",
    "password" => "password"
);
$ironmq = new \IronMQ\IronMQ(array(
    "project_id" => '57a7b7b35e8e331d45000001',
    "keystone" => $keystone
));

基础知识

向队列发送消息

<?php
$ironmq->postMessage($queue_name, "Hello world");

更复杂的示例

<?php
$ironmq->postMessage($queue_name, "Test Message", array(
    "timeout" => 120, # Timeout, in seconds. After timeout, item will be placed back on queue. Defaults to 60.
    "delay" => 5, # The item will not be available on the queue until this many seconds have passed. Defaults to 0.
    "expires_in" => 2*24*3600 # How long, in seconds, to keep the item on the queue before it is deleted.
));

在一次 API 调用中发送多个消息

<?php
$ironmq->postMessages($queue_name, array("Message 1", "Message 2"), array(
    "timeout" => 120
));

--

预留消息

<?php
$ironmq->reserveMessage($queue_name);

当从队列中弹出/获取消息时,它不会被删除。如果你不删除它,它最终会在超时后返回队列(默认超时时间为60秒)。

在一个API调用中保留多个消息

<?php
$ironmq->reserveMessages($queue_name, 3);

删除、触摸或释放消息等操作需要reservation Id。它可以在保留消息后从消息模型中获取

<?php
$message = $ironmq->reserveMessage($queue_name);
$reservation_id = $message->reservation_id;

--

从队列中删除消息

<?php
$ironmq->deleteMessage($queue_name, $message_id, $reservation_id);

如果消息未被保留,则不需要提供reservation Id

<?php
$ironmq->deleteMessage($queue_name, $message_id);

在处理完消息后从队列中删除它。

在一个API调用中删除多个消息

<?php
$ironmq->deleteMessages($queue_name, array("xxxxxxxxx", "xxxxxxxxx"));

删除由消息id数组指定的多个消息。

也可以删除消息对象数组

<?php
$messages = $ironmq->reserveMessages($queue_name, 3);
$ironmq->deleteMessage($queue_name, $messages);

--

故障排除

http错误:0

如果你看到未捕获的异常 'Http_Exception',消息为 'http error: 0 | ',这很可能是由于配置错误的cURL https证书引起的。有两种方法可以修复此错误

  1. 禁用SSL证书验证 - 在IronMQ初始化后添加此行:$ironmq->ssl_verifypeer = false;
  2. 切换到http协议 - 将以下内容添加到配置选项中:protocol = httpport = 80
  3. 修复错误!建议的解决方案:下载实际证书 - cacert.pem并将它们添加到php.ini
[PHP]

curl.cainfo = "path\to\cacert.pem"

--

更新笔记

  • 1.3.0 - 修改了 postMessagepostMessages 方法中的参数列表。请检查使用这些方法的代码。
  • 1.4.5 - 添加了 getMessagePushStatusesdeleteMessagePushStatus 方法。

--

队列

IronMQ客户端

IronMQ基于IronCore并提供对整个IronMQ API的轻松访问。

<?php
$ironmq = new \IronMQ\IronMQ(array(
    "token" => 'XXXXXXXXX',
    "project_id" => 'XXXXXXXXX'
));

--

列出队列

此代码将返回前30个按名称排序的队列。

<?php
$queues = $ironmq->getQueues();

可选参数

  • per_page:响应中的元素数量,默认为30。
  • previous:这是上一页上的最后一个队列,它将从下一个开始。如果指定的队列名称不存在,则结果将包含第一个按字典序大于previous的per_page队列

假设你有名为 "a","b","c","d","e" 的队列。以下代码将列出 "c","d" 和 "e" 队列

<?php
$queues = $ironmq->getQueues('b', 3);

--

检索队列信息

<?php
$qinfo = $ironmq->getQueue($queue_name);

--

删除消息队列

<?php
$response = $ironmq->deleteQueue($queue_name);

--

向队列发布消息

单个消息

<?php
$ironmq->postMessage($queue_name, "Test Message", array(
    'delay' => 2,
    'expires_in' => 2*24*3600 # 2 days
));

多个消息

<?php
$ironmq->postMessages($queue_name, array("Lorem", "Ipsum"), array(
    "delay" => 2,
    "expires_in" => 2*24*3600 # 2 days
));

可选参数(第3个,键值对数组)

  • delay:项目将在此秒数过去之后才在队列中可用。默认为0秒。最大值为604,800秒(7天)。

  • expires_in:在删除项目之前在队列中保留项目的时间(秒)。默认为604,800秒(7天)。最大值为2,592,000秒(30天)。

  • timeout:已弃用。在发布消息时无法设置超时,只有在保留消息时才能设置。

--

从队列中获取消息

单个消息

<?php
$message = $ironmq->reserveMessage($queue_name, $timeout);

多个消息

<?php
$message = $ironmq->reserveMessages($queue_name, $count, $timeout, $wait);

可选参数

  • $count:获取的最大消息数。默认为1。最大值为100。

  • $timeout:在超时(秒)后,项目将返回队列。你必须从队列中删除消息以确保它不会返回队列。如果没有设置,则使用POST中的值。默认为60秒。最小值为30秒。最大值为86,400秒(24小时)。

  • $wait:长轮询消息的时间(秒)。最大为30秒。默认为0。

--

触摸队列上的消息

触摸保留的消息会返回具有指定或默认超时的新reservation。

<?php
$ironmq->touchMessage($queue_name, $message_id, $reservation_id, $timeout);

--

释放消息

<?php
$ironmq->releaseMessage($queue_name, $message_id, $reservation_id, $delay);

参数

  • $delay:项目将在多少秒后才在队列中可用。默认为0秒。最大值为604,800秒(7天)。

--

从队列中删除消息

<?php
$ironmq->deleteMessage($queue_name, $message_id, $reservation_id);

--

从队列中窥视消息

窥视队列返回队列上的下一个消息,但不会保留它们。

单个消息

<?php
$message = $ironmq->peekMessage($queue_name);

多个消息

<?php
$messages = $ironmq->peekMessages($queue_name, $count);

--

清除队列

<?php
$ironmq->clearQueue($queue_name);

--

推送队列

IronMQ推送队列允许您设置一个队列,该队列会向端点推送消息,而不是需要轮询端点。 这里是关于推送队列概述的公告

创建队列

<?php
$params = array(
    "message_timeout" => 120,
    "message_expiration" => 24 * 3600,
    "push" => array(
        "subscribers" => array(
            array("url" => "http://your.first.cool.endpoint.com/push", "name" => "first"),
            array("url" => "http://your.second.cool.endpoint.com/push", "name" => "second")
        ),
        "retries" => 4,
        "retries_delay" => 30,
        "error_queue" => "error_queue_name"
    )
);

$ironmq->createQueue($queue_name, $params);

选项

  • type:字符串或符号。队列类型。:pull:multicast:unicast。字段必须且静态。
  • message_timeout:整数。消息在队列中未删除或未接触前返回队列的秒数。
  • message_expiration:整数。消息从队列中发布到队列以及消息过期之间的秒数。

以下参数都与推送队列相关

  • push: subscribers:一个包含必需字段nameurl的订阅者哈希数组,以及可选的headers哈希。`headers`的键是名称,值是HTTP头的方式。这组订阅者将替换现有的订阅者。要添加或删除订阅者,请参阅添加订阅者端点或删除订阅者端点。下面是示例json。
  • push: retries:在失败时重试的次数。默认为3。最大为100。
  • push: retries_delay:每次重试之间的延迟(秒)。默认为60。
  • push: error_queue:字符串。用于发布推送错误的队列名称。

--

更新队列信息

与创建队列相同。推送队列不能更改为拉取队列,反之亦然。

在队列上添加/删除订阅者

向推送队列添加订阅者

<?php

$ironmq->addSubscriber($queue_name, array(
       "url" => "http://cool.remote.endpoint.com/push",
       "name" => "subscriber_name",
       "headers" => array(
          "Content-Type" => "application/json"
       )
   )
);

$ironmq->addSubscribers($queue_name, array(
        array(
            "url" => "http://first.remote.endpoint.com/push",
            "name" => "first"),
        array(
            "url" => "http://second.remote.endpoint.com/push",
            "name" => "second")
    )
);

--

替换队列上的订阅者

设置队列的订阅者列表。旧订阅者将被删除。

<?php

$ironmq->replaceSubscriber($queue_name, array(
       "url" => "http://cool.remote.endpoint.com/push",
       "name" => "subscriber_name"
   )
);

$ironmq->addSubscribers($queue_name, array(
        array(
            "url" => "http://first.remote.endpoint.com/push",
            "name" => "first"),
        array(
            "url" => "http://second.remote.endpoint.com/push",
            "name" => "second")
    )
);

从队列中删除订阅者

从队列中删除订阅者。这仅适用于推送队列。

<?php

$ironmq->removeSubscriber($queue_name, array(
       "name" => "subscriber_name"
   )
);

$ironmq->removeSubscribers($queue_name, array(
        array("name" => "first"),
        array("name" => "second")
    )
);

获取消息推送状态

<?php
$response = $ironmq->postMessage('push me!');

$message_id = $response["ids"][0];
$statuses = $ironmq->getMessagePushStatuses($queue_name, $message_id);

返回包含状态的订阅者数组。

--

确认,推送消息已处理

此方法可用于确认推送消息的处理。有关长处理信息,请参阅IronMQ v3文档

<?php
$ironmq->deletePushMessage($queue_name, $message_id, $reservation_id, $subscriber_name);

--

更多链接

© 2011 - 2013 Iron.io Inc. 版权所有。