syckのインストール
YAMLについて実際に触って理解を深めたいと思ったので、早速syckをインストールしてみました。(参考にしたのは以下のサイトです)
- ( Syck ): YAML for Ruby, Python, PHP and OCaml
- Symfonyで開発日記 » YAMLパーサSyckを利用する
- InstallingSyck - symfony - Trac
$ tar zxvf syck-0.55.tar.gz $ cd syck-0.55 $ ./configure $ make $ sudo make install $ cd ext/php $ sudo sh make_module.sh
その後、php.iniに拡張モジュールを動的に読み込むように以下の1行を追加します。
extension=syck.so
設定後、Apacheを忘れずに再起動します。その後、PHPコマンドを以下の通りに実行し、念のsyckのテストを行います。
php -r 'print_r(syck_load("requirements: { something: 1 }"));'
本来であれば、以下の通りに結果が帰ってくるハズなのだが、エラーが表示される。以下の通りに結果が帰ってきました。
Array ( [requirements] => Array ( [something] => 1 ) )
ちなみにエラーは以下の通りです。
Fatal error: Call to undefined function syck_load() in Command line code on line 1
dl()関数を使ってロードさせてあげれば問題なく動くのですが、そのようなコードを入れる必要はないはずなので、何だか気持ちが悪い。うーん、どこが悪いんだろ?明日、また見直すことにします。
あとsyckをインストールしたはいいのだけど、どの関数が利用できるのか全く分からなった(PHP向けのマニュアルが見つからなかった)ので、以下のスクリプトを作成して確認を行いました。
<?php if (!extension_loaded('syck')) { if (!dl('syck.so')) { die('Cannot load syck extension.'); } else { print '<strong>Now loading.....</strong><br />'; } } // function list $funcs = get_defined_functions(); $funcs_in = $funcs['internal']; foreach ($funcs_in as $func) { if (strpos($func, 'syck') !== false) { print $func . '<br />'; } } ?>
結果は以下の通りで、syck_load()関数のみ利用できるっぽいです。
syck_load
実際には、YAMLの設定ファイルを読み込むロジックが必要ですが、簡単に書くとこんな感じの記述になりますね。
<?php if (!extension_loaded('syck')) { if (!dl('syck.so')) { die('Cannot load syck extension.'); } else { print 'Now loading.....'; } } $str = <<<___END___ A: aaa B: B1: 123 B2: 456 C: true ___END___; $doc = syck_load($str); var_dump($doc); ?>
【追記】
今更ですが、原因は、単純でphp.iniのパスに誤りがあっただけでした。職場と自宅でパスが違うからずっと勘違いしていたのでした。(苦笑)