syckのインストール

YAMLについて実際に触って理解を深めたいと思ったので、早速syckをインストールしてみました。(参考にしたのは以下のサイトです)

$ 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のパスに誤りがあっただけでした。職場と自宅でパスが違うからずっと勘違いしていたのでした。(苦笑)