作成日
2006-01-31

StaticRSS

RSSを静的に作成する事でNucleusの速度向上を試みます。

StaticRSSって何?

StaticRSSは静的なRSSリソースを生成するプラグインです。

Nucleusはほぼ全てのリソースを動的に生成します。記事の全文を配信する場合、ファイルサイズが大きくなってしまい、サーバにも大きな負担がかかります。

RSSは記事の変更時にか変わらない筈なので、RSSを静的に生成すれば従来の「データベースにアクセス→PHPで整形」というプロセスを省略することができ、負担の軽減とともに取得時間の短縮などの効果をもたらすことが出来るのではないかと考えました。

動作環境

  1. PHP 4.3.0以上
  2. allow_url_fopenが真値(True、1、On等)であること

2番目の条件を満たしているかどうか確認するには、<? phpinfo(); ?>とだけ記述したphpのコードを作成し、Webブラウザ等からアクセスしてください。allow_url_fopenが偽値(False、0、Off等)である場合はこのプラグインを使う事が出来ません。

この動作条件はfile_get_contents関数を使ってリモートファイルにアクセスさせている為に生じるものです。

コード

このコードの最新版はtrunkから入手可能です。

<?php

class NP_StaticRSS extends NucleusPlugin {

function getName() {// name of plugin
    return 'StaticRSS'; 
}

function getAuthor()  {// author of plugin 
    return 'ak'; 
}

function getURL() {// an URL to the plugin website
    return 'http://micelle.org/trash/static-rss/'; 
}

function getVersion() {// version of the plugin
    return '0.2'; 
}

// a description to be shown on the installed plugins listing
function getDescription() { 
    return 'create static rss when you create or modified items';
}

function supportsFeature($what) {
    switch($what){
        case 'SqlTablePrefix':
            return 1;
        default:
            return 0;
        }
}

function getEventList() { return array('PostAddItem', 'PostUpdateItem', 'PostDeleteItem'); }

    function install() {
        $this->createOption("script", "URI of RSS script", "text", "http://example.com/xml-rss2.php");
        $this->createOption("rssfile", "filename to create", "text", "../xml-rss2.xml");
    }
    
    function uninstall() {
    }
    
function event_PostAddItem(&$data) {
    $this->createRSS();
    return;
}

function event_PostUpdateItem(&$data) {
    $this->createRSS();
    return;
}

function event_PostDeleteItem($data) {
    $this->createRSS();
    return;
}

function createRSS() {
    $fp = fopen($this->getOption('rssfile'), 'w');
    if($fp) {
        $feed = file_get_contents($this->getOption('script'));
        fwrite($fp, $feed);
        fclose($fp);
    }
    return;
}

}
?>

使い方

下準備

  1. MultipleCategoriesプラグインのページを参考にして、ITEM.phpに変更を加えます。これにより、NucleusはStaticRSSを記事のアップデート後に作動させることが可能となります。
  2. RSSを作成したいディレクトリに空のRSSファイル(または空のフォルダ)を作成し、PHPから書き込み可能な状態にしておきます。
  3. xml-rss2.phpの19行目を$CONF['Self'] = "index.php";に変更して転送します。
  4. 必要ならば、xml-rss2.phpを他の名前に変更します(このファイルにアクセスされないようにするための簡易的な処置です)。

プラグインのインストール、設定

  1. コードをダウンロードし、ファイル名をNP_StaticRSS.phpとして、nucleus/pluginディレクトリに転送します。
  2. 管理画面のプラグイン管理からStaticRSSをインストールします。
  3. 管理画面のプラグイン管理インストール済みというリストの中からStaticRSSの欄を探し、編集を選択します。
  4. URI of RSS scriptの値をxml-rss2.phpのURI(URL)に変更します。
  5. filename to createの値を出力するRSSファイルのパスに変更します。デフォルトでは、../xml-rss2.xmlとなっています。これは、xml-rss2.phpと同じディレクトリにxml-rss2.xmlというファイル名で作成することを表しています。
  6. オプションの保存を選択して設定値を保存します。

おまけ: アンテナサイトに対応する

記事の追加時と変更時にRSSが生成されるという事は「このファイルの作成時刻=サイトの更新時刻」だと看做すことが出来るので、これを使って更新時刻を出力させることが出来そうです。静的に生成されたファイルならば、WebサーバがLast-Modifiedヘッダ等を勝手に生成してくれるのでPHPは使わずに済みます。

多くのアンテナサイトは先ずHEADリクエストによってLast-Modifiedヘッダの取得を試みるので、目次(index.php)へのHEADリクエストに対してはRSSファイルにアクセスさせるようにします。以下は、Apacheを使用している場合に.htaccessに追加する内容です。

RewriteEngine On
RewriteCond %{REQUEST_METHOD} HEAD [NC]
RewriteRule ^index.php$ xml-rss2.xml [L]

稀にユーザによる設定変更が許可されていない場合があります。その場合にはこの手法を使うことは出来ません。

RSSが生成されるタイミング

StaticRSSは、

にRSSファイルを自動的に生成します。特別な操作は必要ありません。