[PHP]PubSubHubbub(PuSH)を使ってサイトの更新を瞬時に通知

Facebook にシェア
Delicious にシェア
LINEで送る
Pocket

通常、RSS リーダーなどで最新の記事があるかをチェックするには、定期的にサイトをチェックする必要がありました。そこで、データの変更をリアルタイムに通知するためのプロトコル「PubSubHubbub(パブサブハバブ)」が作られ、更新があった場合瞬時に RSS リーダーにプッシュ通知を送ることができるようになりました。これにより、定期的にサイトをチェックして更新がないか確認する必要がなくなり、更新通知を受けてから読み込みに行くこと可能となります。
WordPress ではプラグインの「pubsubhubbub」や「PuSHPress」などを使って実装することができます。

PHP でも curl を使った POST でサーバーと簡単にやりとりすることが可能です。
パラメーターは検索エンジンによって異なりますが、Google の場合 hub.mode と hub.url をサーバー (http://pubsubhubbub.appspot.com/)に送信することで要求できます。

hub.url とはフィードの URL で、更新したことを伝える場合 hub.mode は「publish」としておきます。

PHP の関数にしたものがこちらです。

<?php
// フィードのURL
$feed = 'http://example.com/feed/rss/';

pubSubHubbub($feed);

function pubSubHubbub($feed){
	$url = 'http://pubsubhubbub.appspot.com/';
	$post = array(
		'hub.mode' => 'publish',
		'hub.url' => $feed
	);

	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_POST, true);
	curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));
	curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded'));
	curl_setopt($ch, CURLINFO_HEADER_OUT, true);
	$response = curl_exec($ch);
	$info = curl_getinfo($ch);
	//print_r($info);
	curl_close($ch);
	return $response;
}

フィードの自動探査に対応させる

RSS や Atom フィードを PubSubHubbub に対応させるには、記述を追加する必要があります。
必要とする要素や形式、記述の詳細は送信先サーバーの仕様によって異なりますが、一例として「http://pubsubhubbub.appspot.com」のケースを説明します。

【RSS 1.0 / RSS 2.0 の場合】

<?xml version="1.0"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <atom:link rel="hub" href="http://pubsubhubbub.appspot.com" />
    <atom:link rel="self" type="application/rss+xml" href="http://example.com/feed/rss/" />
    ...
  </channel>
</rss>

rss 要素(rdf:RDFの場合も同様)に「xmlns:atom="http://www.w3.org/2005/Atom"」を追加し、channel 要素内に link 要素として PubSubHubbub サーバー(hub)と自サイトのフィード URL (self)を追加します。

【Atom の場合】

属性 hub と self の link 要素を追加し、hub に Pubsubhubbub サーバー、self に自サイトのフィード URL を記述します。

<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>...</title>
  <link rel="hub" href="http://pubsubhubbub.appspot.com/" />
  <link rel="self" type="application/atom+xml" href="http://example.com/feed/atom/" />
  ...
  <entry>
  ...
  </entry>
</feed>

リアルタイムに更新通知を受けるには、フィードリーダー側も PubsubHubbub に対応している必要があります。

参考:
https://pubsubhubbub.googlecode.com/git/pubsubhubbub-core-0.4.html


Similar Posts:




  • This entry was posted in PHP and tagged . Bookmark the permalink.

    7 Responses to [PHP]PubSubHubbub(PuSH)を使ってサイトの更新を瞬時に通知

    1. doragon says:

      初めまして。現在通常のWEBサイトの更新情報を以下に早くGoogleに送ることを調べていたところ、このページを発見しました。

      早速上記のコードをコピーし、$feedの部分をRSSフィードのURLに変更しました。
      そして以下の手順で実行してみましたが、実際にちゃんと実行出来ているかどうかがよく分からなかったので教えて頂けますでしょうか?
      //実行した手順
      ①上記のコードをコピー
      ②自分のphpファイルにペースト(ローカルのXamppフォルダの中に)
      ③$feedの部分をRSSフィードのURLに変更。
      ③Xamppを起動して、ファイルを開く
      ④Call to undefined function curl_init()というエラーが表示される
      ⑤php.iniファイルの中の954行目あたりの「;extension=php_curl.dll」の「;」を消す
      ⑥再び実行ファイルを更新
      ⑦エラー表示が消えて何も表示されないページに変わった

      以上の様な感じになったのですが、これは正しく実行されたのでしょうか?
      何しろ、私が素人なのでアドバイス頂けないでしょうか?

      お手数ですが、よろしくお願いします。

    2. PHP-Archive says:

      ブラウザ画面に何も表示されない事自体は正常です。
      送信結果はサンプルソースの $info に格納されているので、
      「//print_r($info);」のコメントアウトを外せば結果が表示されます。
      送信先によって異なりますが「http_code」が2XXであれば成功しています。(こちらの環境では204)

    3. doragon says:

      早速お返事頂きましてありがとうございます。
      2度目に「//print_r($info);」のコメントアウトを外してやってみたら、Array()で結果が表示されたようでした。
      その中に、[http_code] => 204と書いてある部分があったので、成功という事ですね!
      ご親切にありがとうございます。

      もう一つお聞きしたいのですが、フィードの書式に関してはRSSとAtomがあるそうなのですが、これはどちらでも大丈夫なのでしょうか?

    4. doragon says:

      ご丁寧に追記をして頂きましてありがとうございます。勉強になりました。

      RSS や Atom フィードを PubSubHubbub に対応させるには、記述を追加しなければいけないとの事ですが、この追加の記述が無いと、一見phpプログラムで実行してみて、成功しているように見えても、実は成功していないという理解でよろしいでしょうか?

    5. PHP-Archive says:

      説明不足な部分があったので補足しました。
      PubSubHubbub サーバーに更新情報を送信すると専用のクローラー(BOT)が巡回してきます。
      クローラーはフィードを読み、link 要素の情報を元に URL を登録します。
      Google のハブには不要ですが、ハブを利用するための発行者登録が必要な場合もあります。

    6. quest says:

      こんばんは。大変参考になります。

      ところで、作成された関数は、RSSフィードを対象としていますが、http://a.com/b.htmlのような単一のURLを送信できるものが、GitHubに公開されているらしいです。それがこちらです。

      joshfraser/pubsubhubbub-php · GitHub
      https://github.com/joshfraser/pubsubhubbub-php

      このような関数はphpのcURLでも実現できますか?
      できるとすれば、ここでひとつ要望を送らせてもらいたいのですが、それを考案して公開していただけないでしょうか・・・。

      よろしくお願いします。

    7. PHP-Archive says:

      リンク先のライブラリを確認しました。
      結果的に出力される送信内容自体は同一のものですのでどちらを使ってもほぼ変わりはありません。
      本プログラムでは hub.url にフィードのアドレスを指定しているのは Google のドキュメントにある、
      「hub.url equal to the feed URL of the feed that has been updated.」
      (hub.url は更新されたフィードのフィードURLと同じ)
      という説明を元にしています。

      Zend Frameworkのサンプル(http://framework.zend.com/manual/current/en/modules/zend.feed.pubsubhubbub.html#zend-feed-pubsubhubbub-publisher)でも RSS や ATOM フィードの URL を指定していたのでそちらに合わせてありますが、送信先サーバーの仕様によってはトピック自体のURLでも受け付けている場合があるのかもしれません。

    コメントを残す

    メールアドレスが公開されることはありません。