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



last updated
2007/07/08

counter hits
since 1999/11/06


PHPでYAMLを扱う

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を表示して以下のような項目が現れれば、インストール成功です。

phpinfo

SyckのPHP拡張モジュールから提供される関数はsyck_load関数の1つだけで、YAML形式のデータを文字列として渡すとPHPのハッシュに変換して返します。

さて、動作確認ですが、今回は

の2つで試してみました。後ほど、spycでも使用します。それぞれ、以下のような内容です。

●phppro.yml
database:
 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)。。。後日、再チャレンジしてみよう。



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