-
symfonyを無理して動かしてはいけないのである。
Posted on 12月 9th, 2008 はおりん No comments何事も無理は禁物である。無理をすると以下のような害を発生する恐れがある。
・予定通りに進まなくなる。
・体調を崩す。
・良くないモノが出来上がる。
・精神が崩壊する。
・小人さんが見える。
・机がガタガタと音を立てる。
特に、小人さんが見えたら要注意だ。小人さんはとてもイタズラ好きなので、必要なものを隠してしまう。例えば、必要なときに限ってGoogle先生が死んでしまうなどだ。忠告に従わず、無理をすればかならず上記のような症状に陥るだろう。たとえば、すでに稼動しているSymfonyのプロジェクトに別のデータベースを利用するアプリケーションを追加してみたり、「PHP5.2.1が無いとsfDoctrinePluginは動かない」と言われているのに無理して動かそうとすると、僕のように丸々3時間以上ハマることになる。
事の始まりは「Propelが遅い」ということだった。何はともあれこの辺りでSymfonyについて説明しておこう。SymfonyとはPHP5向けのフレームワークの1つで、「それなりに速い」と言われている。実のところとても使いやすく、僕は気に入っている。そして、このSymfonyのデータベースアクセスに標準で使われているのが「Propel」というライブラリである。Propelは「Creole」というライブラリを使用してデータベースにアクセスするのだが、これが遅いらしい。PHP5には元々「PDO」という抽象化エンジンが実装されていて、これを使うのが高速だと言われているが、PropelはこのPDOよりも前の世代の存在だったのだ。
というかこのPDO、抽象化の度合いが低く、結構、いや、かなり気をつけないと、真に抽象化されたアプリケーションは開発できない。PropelにもPDOに対応した「Propel1.3」というものもあるのだが、今回はもうひとつのデータベースアクセスライブラリである「Doctrine」を使おうと思った。以前使ったことがあるからだったのだが、まさかこのような悲劇が待ち受けていようとは・・・今回はプラグインのインストールをsvnを用いて行った。理由はsymfony1.0とsymfony1.1が同居している環境のため、ちゃんとインストールできるか心配だったからだ。なので、自分の思ったとおりの場所にインストールするために、svnで直接チェックアウトしてきた。そしてsfDoctrineを動かそうとすると・・・「sys_get_temp_dirが無い」と言う。この関数はPHP5.2.1以上で利用できるものらしい。そしてここの考えが甘かった。「sys_get_temp_dirがあれば、PHP5.2.0.8でも動くんじゃね?」と思ってしまったのだ。なんと浅はかな・・・なんと愚かな・・・なんと不運な・・・
と、いうわけで、/config/ProjectConfiguration.class.phpにsys_get_temp_dirを仕込んで動かしてみると・・・おやおや動くじゃないですか。なぁんだ動くじゃーんというわけで、スキーマを作ってモデルを作ってデータベースにアクセスしてみたりして、Doctrineの使い方を覚えていく。しかし・・・
リレーションを張ったテーブル同士をジョインしてデータを取得した後、そのレコードコレクションをforeachで回そうとすると、setDataというメソッドをオブジェクトじゃないものに対して呼ぼうとして、FatalErrorを吐く。いやいやいやいやいや、おかしいではないか。どうも本来Doctrine_Recordのオブジェクトが入っているべき配列に、なんだか文字列が入っている模様。良く分からない。Doctrineのバージョンを下げてみたりしたけど、ダメ。結局この後、以下の試行錯誤の末3時間以上もハマることになる・・・
・sfDoctrinePluginのバージョンを下げてみる⇒動かない。
・問題のあるコードをコメントアウトしてみる⇒動いたけど、すこぶる怪しい。
・Propelを入れようとしてみる⇒そもそもPropel1.3を入れようとするとPHPの5.2.5以上が必要だと言われる。
・sfDoctrinePluginの中で使われているDoctrineのバージョンを下げてみる⇒動かない
・sources.listをetchからlennyに変えてaptitude dist-upgradeしてみる⇒大当たりつまり、やはり根本の原因はPHP5.2.0.8だったことにあるのだ。やはり無理して動かそうとしたのがいけなかったのか・・・というよりそもそも説明をちゃんと読んでいないのがいけないのである。英語だし短い文章だし、たいしたことは書いてないだろうと思って、ちらと見ただけで放置していたのだが、その大したことの無い情報の中に、非常に基本的すぎる情報があったのだ。・・・当然か。
本日の教訓
READMEはちゃんと読みましょう。
プログラミング PHP, プログラミング, 失敗コメントを書く