Publish/Subscribeモデル

PubSubHubbub (PuSH)

  • パブリッシュ (Publish) … 発行
  • サブスクライブ (Subscribe) … 購読
  • ディスカバー (Discover)

Google Pubsubhubbub Hub

テストの方法

必要なファイルの準備

Hubのテストをするには、まず

  • 対象となるフィード
  • Hubからの配信を受け取るサブスクライバ

の2つを用意します。

ここではフィードをAtomで記述することとします。それは、たとえば次のようなものです。

<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>Sample</title>
    <subtitle>Sample feed</subtitle>
    <id>abc</id>
    <link rel="hub" href="https://pubsubhubbub.appspot.com/" />
    <link rel="self" href="http://example.com/topic.atom" />
    <author>
        <name>TEST</name>
    </author>
    <updated>2013-01-01T00:00:00+09:00</updated>

    <entry>
        <title>Entry1</title>
        <id>e1</id>
        <updated>2013-01-01T00:00:00+09:00</updated>
    </entry>
    <entry>
        <title>Entry2</title>
        <id>e2</id>
        <updated>2013-01-01T00:00:00+09:00</updated>
    </entry>
</feed>

ここで重要なのは、

<link rel="hub" href="https://pubsubhubbub.appspot.com/" />
<link rel="self" href="http://example.com/topic.atom" />

の2行で、1行目でGoogleのHubを使用することを明示しています。2行目のhref属性の値はこのフィード自身のURLで、フィードを配置するURLに合わせて書き換えます。

サブスクライバは、PHPで次のように記述します。この例ではチャレンジコードを受け取ったらそれを出力し、それ以外ではリクエストのbodyをファイルに保存します。

<?php

if( isset( $_GET[ 'hub_challenge' ] )  )
{
    header( 'HTTP/1.1 200' );
    header( 'Content-Type: text/plain' );
    echo $_GET[ 'hub_challenge' ];

    file_put_contents( 'challenge.txt', print_r( $_GET, TRUE ) );
}
else
{
    $contents = file_get_contents( 'php://input' );
    file_put_contents( 'new-feed.txt', $contents );
}

これらのファイルをサーバにアップロードしたら、そのURLをメモしておきます。ここでは仮に、

  • フィードのURL … http://example.com/topic.atom
  • サブスクライバのURL … http://example.com/subscriber.php

とします。

Hubへの登録 (購読)

次に、サブスクライバをHubに登録します。Google Pubsubhubbub Hub - Subscription debugへアクセスし、[Subscribe/Unsubscribe]の各項目に、

  • Callback URL … サブスクライバのURL
  • Topic URL … フィードのURL
  • Mode … 'Subscribe'

のように入力し、[Do It!]をクリックします。実行後の画面には何も表示されませんが、HTTPのレスポンスで'HTTP/1.1 202 Accepted'が返されれば完了です。

このときサブスクライバの確認のため、Hubからチャレンジコードを含めたリクエストが送られます。サブスクライバが正しく処理できていれば、それがサーバに

Array
(
    [hub_topic] => http://example.com/topic.atom
    [hub_challenge] => 0123456789
    [hub_mode] => subscribe
    [hub_lease_seconds] => 432000
)

のように、challenge.txtのファイル名で記録されるはずです。

Hubへの更新通知 (出版)

Hubへフィードの更新を通知するには、Google Pubsubhubbub Hub - Publisher debugへアクセスし、[Publish]の項目に、

  • Topic URL … フィードのURL

のように入力し、[Publish]をクリックします。このときブラウザの表示は変化しませんが、それで正常です。

Hubへ更新を通知をすると、Hubはサブスクライバへフィードを配信します。今回用意したサブスクライバでは、そのフィードは[new-feed.txt]のファイル名でサーバに記録されます。ただし、この段階ではフィードを更新していないため、実際にはサブスクライバへは配信されないはずです。

ここでフィードを更新します。フィードのfeed要素に、

    <entry>
        <title>Entry3</title>
        <id>e3</id>
        <updated>2013-01-01T00:00:00+09:00</updated>
    </entry>

のように<entry>を追加してみます。そして、ふたたびPublisher debugのページで更新を通知します。そうすると、今度はサブスクライバへフィードが配信されるはずです。配信された内容は、サーバに[new-feed.txt]の名前で

<?xml version='1.0' encoding='UTF-8'?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>Sample</title>
    <subtitle>Sample feed</subtitle>
    <id>abc</id>
    <link rel="hub" href="https://pubsubhubbub.appspot.com/" />
    <link rel="self" href="http://example.com/topic.atom" />
    <author>
        <name>TEST</name>
    </author>
    <updated>2013-01-01T00:00:00+09:00</updated>
    <entry>
        <title>Entry4</title>
        <id>e4</id>
        <updated>2013-01-01T00:00:00+09:00</updated>
    </entry>
</feed>

のように記録されるはずです。これで、サブスクライバへの配信を確認できます。