VISH,Inc.

CakePHP 1.2.5はPHP 4.3.10で動作しないけど、PHP 4.3.11にすると動く話

CakePHP 1.2.5を利用して開発したソースコードをサーバーにアップして
稼働確認すると、動作せず。

CakePHPを利用していて、環境を変更した事で発生する不具合の原因としては、
「mod_rewriteの設定ミス」や「テンポラリディレクトリの書込権限設定もれ」などが
あげられますが、今回の設定は正しい模様。

自前で作成したコードが悪いのか、CakePHPのライブラリが悪いのかを切り分けるため
試しに素のCakePHPをダウンロードし直して設置してみると、同様の事象が発生。

近道は諦めて、腰を据えてCakePHPをデバッグしてみる事にしました。

エラーログを出力してみると、CakePHPのライブラリ内でエラーが発生していました。

Fatal error: Call to a member function on a non-object in ./cake/libs/view/layouts/default.ctp on line 34

該当箇所を確認してみると

echo $html->meta('icon');

HTMLヘルパを使ってメタタグを出力している箇所で、オブジェクトが無いぞ!と怒られています。
通常では発生しない状況です。

デバッグを繰り返していると、CakePHPのヘルパを初期化する処理でoverload()している所で
異常に処理に時間がかかる場合が発生する事がわかりました。

しかし、怪しげな処理をしている様には見えないので、CakePHPではなく、
PHP自体の処理を疑ってPHP 4 ChangeLogを眺めてみました。

すると、4.3.10→4.3.11へのチェンジログで気になる箇所が。

 Fixed bug #31106 (Fixed crash in overloaded objects).
 Fixed bug #28086 (crash inside overload() function).

具体的な挙動はわかりませんが、overloadに関する処理が修正されている様です。

という事は、4.3.11で動作させれば発生しないのでは!?と思い試してみると、正常に動作。
この事から、PHPのバグに触れてしまっている可能性が高いと考えられます。
また、この現象はWindows/LinuxどちらのOSでも発生しました。

CakePHPのドキュメントには

PHP 4.3.2 or greater. Yes, CakePHP works great on PHP 4 and 5.

と記述されていますが、実際は4.3.11以上で動作、という事になるようです。

PHP4.3.10というのは大分古いバージョンですので、本来であれば
PHP5やPHP4の最終バージョン(4.4.9)にバージョンアップするべきですが、
既存システムとの兼ね合いもあるため、簡単にはいきません。

またCakePHP自体を修正するという案もありましたが、
代替案がわからず、修正やテストにかける体力も無いため
今回は、別のサーバーで動作させる事となりました。

PHP4環境でCakePHPを動作させる場合は、ご注意ください。

滝本

blog.vish.co.jp

Leave a Reply


VISH企業サイト
サイトマスター.jp
モバイルサイト制作・構築