導入
Webサイトを運営する際、新しい記事を公開しても、検索エンジンのクローラーが巡回してくるまでインデックスに反映されないというタイムラグに悩まされることは少なくありません。この課題を解決するのが「PubSubHubbub(現在はWebSubと呼称)」というプロトコルです。これを利用することで、サイトの更新情報をハブサーバー経由で検索エンジン等にプッシュ通知でき、実質的な「即時インデックス」を促進することが可能になります。本記事では、PHPでこの仕組みを実装する方法と、現場で押さえておくべき注意点を解説します。
基礎知識
PubSubHubbubは、購読者(RSSリーダーや検索エンジン)がサイトの更新を「ポーリング(定期的なチェック)」するのではなく、発行者側から更新があったことを「プッシュ」して知らせる仕組みです。
仕組みはシンプルで、以下の3者が連携します。
1. 発行者(あなた):更新時にハブへ通知を送る。
2. ハブサーバー:通知を受け取り、購読者に更新があったことを伝える。
3. 購読者:ハブから通知を受け取り、即座にフィードを取得しにくる。
実装/解決策
PHPのcURLライブラリを使用することで、簡単にハブサーバーへPOSTリクエストを送信できます。実装のポイントは、更新通知のモードを「publish」に設定し、フィードのURLを正しく渡すことです。また、サイト側のフィード(XML)にも、どのハブを利用するかを記述しておく必要があります。
サンプルプログラム
以下は、PHPでGoogleのハブサーバーへ更新通知を送るための実用的なコードです。
/
function notifyPubSubHubbub($feedUrl) {
// GoogleのハブサーバーURL
$hubUrl = ‘https://pubsubhubbub.appspot.com/’;
// 送信データ
$params = [
‘hub.mode’ => ‘publish’,
‘hub.url’ => $feedUrl
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $hubUrl);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 結果を取得可能にする
curl_setopt($ch, CURLOPT_TIMEOUT, 10); // タイムアウト設定(実務では必須)
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$error = curl_error($ch);
curl_close($ch);
// 204 No Content が返れば成功
if ($httpCode === 204) {
return true;
}
// エラーログ出力など(実務用)
error_log(“PubSubHubbub通知失敗: HTTP {$httpCode}, Error: {$error}”);
return false;
}
// 実行例
$feed = ‘https://example.com/feed/rss/’;
if (notifyPubSubHubbub($feed)) {
echo “通知に成功しました。”;
}
?>
応用・注意点
実務で導入する際には、以下の点に注意してください。
1. フィード側の設定(discovery)
コードを送信するだけでなく、XMLフィード内に「ハブの場所」を記述しなければ、クローラーが正しく認識できません。RSSやAtomファイルのタグ内に、<atom:link rel=”hub” href=”https://pubsubhubbub.appspot.com/” /> を忘れずに記述してください。
2. エラーハンドリングの重要性
サンプルコードにも含めましたが、cURLのタイムアウト設定は重要です。ハブサーバーが混雑している際に処理がブロックされると、Webサイトの表示速度に悪影響を及ぼします。非同期処理や、バックグラウンドでのキュー処理(LaravelのQueueやRedisなど)を活用して、メインのレスポンスに影響を与えない設計にすることをお勧めします。
3. 204ステータスコードの理解
多くの初心者が「何も返ってこない=失敗」と勘違いしますが、このプロトコルでは正常終了時に「204 No Content」が返されます。レスポンスボディを確認するのではなく、HTTPステータスコードを判定基準にしましょう。