|
YAML(YAML Ain't Markup Language)は、XMLのような「構造化されたデータ」を表現するためのフォーマットです。XMLは要素(タグ)を使って構造を表しますが、YAMLの場合、主にインデントを使って構造を表します。
XMLは要素(タグ)を使って構造を表しますが、YAMLの場合、主にインデントを使って構造を表します。YAMLの日本語での解説は、Rubyist MagazineのYAML入門シリーズが詳しいです。
PHPでは、フレームワークであるSymfonyの各種データファイル、SeasarプロジェクトのO/RマッパーS2Dao.PHP5の結果セット(ResultSet)などですでに使われています。
PHPでYAMLを扱う場合、よく使われているものとして以下の2つがあります。
Syckは拡張モジュール、spycはPHPで書かれたライブラリとして、それぞれ提供されています。
ここでは、上記のインストールから簡単な使い方までをまとめてみました。
使用した環境
今回の環境は、CentOS4.5+Apache2.2.4+PHP5.2.3です。PHPは以下のようなconfigureオプションを付けてソースからbuildしています。
●PHP5.2.3のconfigureオプション--with-apxs2=/usr/local/apache2/bin/apxs \
--prefix=/usr/local/lib/php5 \
--with-pear=/usr/local/lib/php5/pear \
--with-config-file-path=/usr/local/lib/php5/ini/5.2.3 \
--with-config-file-scan-dir=/usr/local/lib/php5/ini.d \
--enable-zend-multibyte \
--enable-mbstring=shared \
--with-dom \
--enable-filter=shared \
--with-gettext=shared \
--with-mcrypt=shared \
--with-gd=shared \
--with-jpeg-dir \
--with-png-dir \
--with-zlib-dir \
--with-ttf \
--with-freetype-dir \
--enable-gd-native-ttf \
--enable-gd-jis-conv \
--enable-soap=shared \
--enable-pdo=shared \
--with-pdo-sqlite=shared \
--with-sqlite=shared \
--enable-sqlite-utf8 \
--with-openssl=shared \
--with-curl=shared \
--enable-bcmath=shared \
--enable-pcntl=shared \
--enable-sockets=shared \
--with-oci8=shared,/usr/lib/oracle/xe/app/oracle/product/10.2.0/server/ \
--with-pdo-oci=shared,/usr/lib/oracle/xe/app/oracle/product/10.2.0/server/ \
--with-pdo=shared \
--enable-sigchild \
--with-xsl=shared \
--enable-zip=shared
いずれも「--prefix」オプションを付けているため、phpコマンドのパスがデフォルトとは変わっていますが適宜読み替えてください。また、別途Xdebug2.0.0RC4をインストールしてあります。
まずは、Syckから
SyckはRubyでも使われているYAMLリーダ/ライタです。Syckライブラリと各言語向けモジュールのコードが配布されています。PHP用拡張モジュールでは、YAMLリーダのみ提供されています。
まずはインストールですが、RubyForgeからソースアーカイブをダウンロードします。2007/07/07現在の最新版はバージョン0.55です。ダウンロード後、アーカイブを展開し、libsyckをインストールします。手順はお決まりのconfigure・make・make installでOKです。
$ wget http://rubyforge.org/frs/download.php/4492/syck-0.55.tar.gz
$ tar zxf syck-0.55.tar.gz
$ cd syck-0.55/
$ ./configure
$ make
$ su
# make install
# exit
$
続いて、PHP用拡張モジュールのインストールです。ソースディレクトリの直下にextディレクトリがあり、各言語用の拡張モジュールのソースが用意されています。phpディレクトリに移動し、phpizeを使ったお決まりの手順でインストールできます。configureオプションの「 --with-syck」ですが、デフォルトでsyckサポートが有効になりますので、付けても付けなくてもOKです。
$ pwd
/path/to/syck-0.55
$ cd ext/php/
$ phpize
$ ./configure
$ make
$ su
# make install
#
あとはphp.iniにextensionディレクティブを追加し、Apacheを再起動します。
# echo "extension=syck.so" >> /usr/local/lib/php5/ini/5.2.3/php.ini
# /usr/local/apache2/bin/apachectl graceful
#
phpinfoを表示して以下のような項目が現れれば、インストール成功です。
SyckのPHP拡張モジュールから提供される関数はsyck_load関数の1つだけで、YAML形式のデータを文字列として渡すとPHPのハッシュに変換して返します。
さて、動作確認ですが、今回は
の2つで試してみました。後ほど、spycでも使用します。それぞれ、以下のような内容です。
●phppro.ymldatabase:
real:
adapter: mysql
host: localhost
database: phppro
username: asial
password: password
test:
adapter: mysql
host: localhost
database: test_phppro
username: test_asial
password: test_password
●rubymagazine.yml## 役職
posts:
- &p91
id: 91
name: 重役
- &p92
id: 92
name: 管理職
- &p93
id: 93
name: 平社員
## 社員
employees:
## 山田は重役、上司はなし
- &e1001
id: 1001
name: 山田○○
post: *p91
supervisor: ~
## 田中は管理職、上司は山田
- &e1002
id: 1002
name: 田中○○
post: *p92
supervisor: *e1001
## 中村は平社員、上司は田中
- &e1003
id: 1003
name: 中村○○
post: *p93
supervisor: *e1002
このYAML形式のファイルをPHPのハッシュに変換するPHPスクリプトは以下の通りです。シンプルすぎ。。。
●syck_sample.php<?php
var_dump(syck_load(file_get_contents('phppro.yml')));
var_dump(syck_load(file_get_contents('rubymagazine.yml')));
出力結果はちょっと長いので別ファイルにしましたので参照してください。ここまで変換できれば、あとは好きなようにできますね :-)
次はspyc
spycはPHPで書かれたシンプルなYAMLローダ/ダンパです。
ということで、インストールはspycのページからアーカイブをダウンロードし、アーカイブをダウンロードして展開するだけです。2007/07/07現在の最新版はバージョン0.2.5です。また、バージョン0.3βも公開されています。今回はバージョン0.2.5を使用しました。
さて、動作確認ですが、Syckの時と同様にYAML形式のデータをPHPのハッシュに変換するPHPスクリプトは以下の通りです。またもやシンプル。。。
●spyc_sample.php<?php
require_once 'spyc.php5';
var_dump(Spyc::YAMLLoad('phppro.yml'));
var_dump(Spyc::YAMLLoad('rubymagazine.yml'));
もしくは、クラスメソッドではなくオブジェクトメソッドでもOKなようです。
●spyc_sample02.php<?php
require_once 'spyc.php5';
$spyc = new Spyc();
var_dump($spyc->load('phppro.yml'));
$spyc = new Spyc();
var_dump($spyc->load('rubymagazine.yml'));
いずれの出力結果もSyckのものと全く同じです。まあ、当然といえば当然なのかも知れませんが、YAML自体は「仕様」なので、その実装により未実装だったりするものがあるようです。
また、spycはPHPのハッシュからYAML形式への変換も可能です。以下は、YAML形式からPHPのハッシュに変換した後、再度YAML形式に戻すサンプルです。
●spyc_sample03.php<?php
require_once 'spyc.php5';
var_dump(Spyc::YAMLDump(Spyc::YAMLLoad('phppro.yml')));
var_dump(Spyc::YAMLDump(Spyc::YAMLLoad('rubymagazine.yml')));
出力結果は別ファイルにしましたので参照してください。さすがにアンカーやエイリアスは無理ですよねぇ(^^;
変換結果のキャッシュについて
上記の通り、YAML形式のデータをハッシュに変換するのはさほど難しくありませんが、毎回変換しているとパフォーマンス的に不利になります。特にspycはPHPで記述されているため、実行してみると意外と「もっさり」していることが分かります。また、巨大なYAML形式のデータを扱う場合などもパフォーマンス問題が発生しそうです。
そこで、設定ファイル系など更新頻度があまり高くないデータについては、変換後のハッシュそのものをキャッシュすることで、パフォーマンスの改善が期待できます。以下のサイトでは、独自クラスやPEAR::Cache_Liteを使ってキャッシュを行うサンプルが掲載されていますので、参考にすると良いと思います。
まとめ
ホントは讃容日記にあるYAML拡張モジュールを試したかったんですけど(^^;、LibYAMLのbuildで失敗してしまったため、今回は見送りました。
「cc1: error: unrecognized command line option "-Wno-pointer-sign"」ということでググってみましたが、gcc4でないとダメっぽい感じでした(使っていたのは3.4.6)。。。後日、再チャレンジしてみよう。
|