Do You PHP?    
Search Engine Optimization  php5 powerd  Valid XHTML 1.0!  Valid CSS!  このサイトのはてなブックマーク数 



last updated
2006/02/19

counter hits
since 1999/11/06


mRss拡張モジュールでRSSしてみる

alertここにある情報はかなり古くなっており、正しくなくなっている可能性があります。掲載しているサンプルコードiなどは、最新のPHPでは動作しない、もしくは、別途設定・調整が必要になるかも知れません。情報を鵜呑みにせず、あなたの手を動かして、あなたの目で確認してください。

PHP-usersネタです。今まで、SAX関数DOM関数PEAR::XML_RSSを使ってそれぞれRSSを取得・表示してみましたが、今回はmRssライブラリを使ったモジュールがあるということで試してみました。

上鍵さんの投稿にもあるとおり、mRss自体はCのライブラリとして提供されていますが、PHP拡張モジュールに変換するスクリプトも含まれています。また、RSS2.0にも対応していることが特徴的です (0.91, 0.92, 1.0, 2.0に対応)。

インストール

まずはインストールした環境ですが、CentOS 4.2のrpmで提供されているPHP 4.3.9です(最近ますます無精になってる。。。)。

上記のドキュメントにもありますが、mRssをインストールするには

が必要になります。今回は、libnxmlはソース、libcurlはCentOSに用意されていたrpmを使用しました。それぞれのインストール手順は以下の通りです。なお、使用したlibnxml、libmrssのバージョンは2006/02/17現在最新のバージョン0.8です。

●libnxmlのインストール
# wget http://www2.autistici.org/bakunin/libnxml/libnxml-0.8.tar.gz
# tar zxf libnxml-0.8.tar.gz -C /usr/local/src/
# cd /usr/local/src/libnxml-0.8/
# ./configure --prefix=/usr
# make
# make install
# 

configureオプションに「--prefix=/usr」を指定していますが、指定しない場合、mRssのインストールの際にごそごそしなければならなくなりますので、付けた方が無難です。

●libcurlのインストール
# up2date -i curl curl-devel
# 

続いて、libmrssをインストールします。こちらもlibnxmlのインストール手順とほとんど変わりません。

●libnxmlのインストール
# wget http://www2.autistici.org/bakunin/libmrss/libmrss-0.8.tar.gz
# tar zxf libmrss-0.8.tar.gz -C /usr/local/src/
# cd /usr/local/src/libmrss-0.8/
# ./configure
# make
# make install
# 

libmrssをインストールした後、PHP拡張モジュールを作成します。ソースのTOPディレクトリ下に「phpmrss」ディレクトリがあり、拡張モジュール作成のためのスクリプトが用意されていますのでこれを使用します。なお、下の実行結果で「warning: underquoted definition」が頻発していますが、これについてはphpizeで「warning: underquoted definition」が多発する場合の対処法を参照してください。今回は放置プレーしてます(^^;

●libnxmlのインストール
# cd phpmrss/
# ./phpmrss_install.sh
Creating a work directory...  done.
Checking data with phpize... configure.in:9: warning:
  underquoted definition of PHP_WITH_PHP_CONFIG
  run info '(automake)Extending aclocal'
  or see http://sources.redhat.com/automake/automake.html#Extending-aclocal
configure.in:32: warning: underquoted definition of PHP_EXT_BUILDDIR
configure.in:33: warning: underquoted definition of PHP_EXT_DIR
configure.in:34: warning: underquoted definition of PHP_EXT_SRCDIR
configure.in:35: warning: underquoted definition of PHP_ALWAYS_SHARED
acinclude.m4:19: warning: underquoted definition of PHP_PROG_RE2C
 done.
Configuring...  done.
Compiling...  done.
Installing...  done.
Removing work directory...  done.
# 

スクリプト実行後、所定のディレクトリに拡張モジュールがインストールされていることを確認してください。

●libnxmlのインストール
# ll /usr/lib/php4/
total 1552
-rwxr-xr-x  1 root root 1506684 Nov 11 11:42 mbstring.so
-rwxr-xr-x  1 root root   30752 Feb 15 17:06 mrss.so
-rwxr-xr-x  1 root root   41076 Nov 11 11:42 mysql.so
# 

インストールが終わったら、拡張モジュールをロードするようphp.iniに追記します。

●php.iniの編集
            :
extension=mrss.so
            :

最後にApacheを再起動し、phpinfoの画面で正しくロードされている事を確認します。

phpinfo画面

追加される関数一覧

mRss拡張モジュールを導入することで以下の関数が使用可能になります。取得・パースだけではなく、出力関数も用意されています。

  • mrss_error
  • mrss_free
  • mrss_get
  • mrss_get_last_modified
  • mrss_get_timeout
  • mrss_parse_buffer
  • mrss_parse_file
  • mrss_parse_url
  • mrss_set_timeout
  • mrss_strerror
  • mrss_write_buffer
  • mrss_write_file

RSS取得・表示のサンプル

phpmrssディレクトリやPHP-usersのアーカイブにもありますが、mrss_parse_*でパースを行いmrss_getでデータを取得というパターンになります。ただし、マルチバイト文字を含むRSSの場合、エンコーディング変換が必要になる場合があります。

●mrss.php
  
<?php
define('INPUT_ENCODING', 'utf-8');
?>
<?php
function convert($str) {
    return htmlspecialchars(
            (strtolower(INPUT_ENCODING) == mb_internal_encoding())
            ? $str
            : mb_convert_encoding(
                $str,
                mb_internal_encoding(),
                INPUT_ENCODING));
}
?>
<?php
    /**
     * ハンドルを取得
     */
    $handle = mrss_parse_url("http://mixfeed.jp/1601");
    if (mrss_error($handle) != MRSS_OK) {
        die(mrss_strerror($handle));
    }

    /**
     * RSSデータを取得
     */
    $feed = mrss_get($handle);

    /**
     * channel情報を表示
     *
     * var_dump($feed)とすることで、どういった情報が取得
     * 可能か分かります
     */
    echo '<h1>' . convert($feed['title']) . '</h1>';
    echo convert($feed['description']) . '<br>';
    echo '<hr>';

    /**
     * item情報を表示
     *
     * var_dump($item)とすることで、どういった情報が取得
     * 可能か分かります
     */
    foreach ($feed['item'] as $index => $item) {
        echo '<li><a href="' . $item['link'] . '">'
            . convert($item['title'])
            . '</a></li>';
    }
?>

mrss_write_*について

ざっと試してみましたが。。。

mrss_write_buffer関数についてはSegmentation Faultとなってしまいどうにもなりませんでした。ちなみに、引数としてmrss_parse_*関数から返される値(int型)を渡すようです。

また、mrss_write_fileについては第1引数にリソース型の変数を渡すようですが、何を渡すのか不明です。第2引数にはファイル名を渡すようです。

情報をお持ちの方、是非フィードバックをお願いします。

まとめ

今流行の「Web2.0」の要素としてRSSはかなり盛り上がっています。そういった意味でもこの手のライブラリが色々とでてきそうです。

今回RSSの作成まではできませんでしたが、頻繁に更新されているようなので今後に期待です。



About This Site |  Privacy Policy |  Contact
Copyright © 1999 - 2006 by Hideyuki SHIMOOKA all rights reserved.