0

HTTP_RequestでIf-Modified-Sinceを設定する

フィード関連のサービス(フィードリーダー、更新情報の集約)をつくっていると、定期的にフィードを配信するサーバーにフィードを取得しにいかなくてはなりません。
もちろんこのフィード取得のために多少なりともフィードを配信するサーバーに負荷をかけてしまいます。
フィードを配信してる人があってのこの手のサービス、相手に極力迷惑をかけずにやっていきたいものです。
そこで、一時間に一回クロールしてフィードすべてをとってくるのではなく、前回のクロール時以降更新がある場合のみ取得するというやり方がおすすめです。

導入は簡単で、If-Modified-Sinceをクローラーのヘッダーに入れ込むことで実現可能です。

これは2007年6月19日(日) 2時24分23秒以降にフィードが更新されてたら取得するという意味です。
If-Modified-Since: Sun, 19 Jun 2007 02:24:43 GMT

更新された場合はレスポンスコード200を返してくれますので、フィードを取得します。
更新されてない場合レスポンスコード304を返しますので、前回取得時とかわりがないのでそのままにして次の処理にいきます。
更新してないとスルーするのでクローリングする時間も大幅に短縮できます。

一時間前のクローリングから更新がないかチェックするPHPでのサンプルをのっけときます。

require_once "HTTP/Request.php";
$option = array(
"timeout" => "10", // タイムアウトの秒数指定
);
$UA = "hoge";
$url = "http://hoge.com";
$last_modified = gmdate('D, d M Y H:i:s T', time() - 3600);
$http = new HTTP_Request($url, $option);
$http->addHeader("User-Agent", $UA);
$http->addHeader("If-Modified-Since", $last_modified);
$response = $http->sendRequest();
if (!PEAR::isError($response)) {
$resCode = $http->getResponseCode();
if ($resCode == 304) {
echo "not changed";
}
elseif ($resCode == 200) {
echo $http->getResponseBody();
}
else {
echo $resCode;
}
}

大阪のWEB屋です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です