symfony と xdebug を使っているとき *_dev.php で memory_limit エラー
うう・・・・
こんなことに半日近く使ってしまった。
とりあえず解決したので状況からメモ。
memory_limit が小さい? symfony がメモリ食いすぎ?
状況は、symfony で init-project init-app init-module した直後に、生成された hoge_dev.php (たとえば、hoge)にアクセスすると、以下のエラーが出るというもの。
Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 2204501688 bytes) in /usr/share/pear/symfony/log/sfLogger/sfWebDebugLogger.class.php on line 58
運が悪いと、このエラーすらも出力されず、真っ白な画面が写るだけです。
php.ini の memory_limit を食いつぶしているのですが、この時点での memory_limit の設定値は 256MB。生成直後の状態でこんなに消費するのは、少なくとも正常な状態ではありません。
ですので、原因を色々探ってみることにします。
どうやら xdebug が悪さをしていた
大き目の拡張から一つ一つはずして確かめていたところ、xdebug をロードしない場合、正常に *_dev.php でデバッグ画面を見ることができました。
かといって、symfony では xdebug が使えない、というわけではないことはたしかです。*1怪しいのは xdebug の設定です。
xdebug.collect_params = On が原因
/etc/php.d/xdebug.ini に記述してあった内容を一つ一つ消しながら様子を見たところ、
xdebug.collect_params = On
をコメントアウトしたところ、問題なく dev.phpを見ることができました。
xdebug.collect_params ってなんぞ
この設定は、Xdebug が関数トレースあるいはスタックトレースで関数コールが 記録される際に、関数に渡されたパラメータを収集するかどうかを制御します。 初期値は Off です。大きなスクリプトの場合、メモリをたくさん使用してしまい、 大きなスクリプトが実行できなくなるためです。 多くの場合、安全にこの設定を on にできますが、多くの関数コールのあるスクリプトでは パラメータとして巨大なデータ構造になってしますという問題があります。 Xdebug 2 は、メモリにこの情報を保持しないため、メモリ使用量の増加についての問題はありません。その代わり、ディスクに書き込まれます。そのため、ディスク使用量を 見ておく必要があります。
403 Forbidden
なるほど。。
これがOnになっていたわけですね。
それにしても「Xdebug 2 は、メモリにこの情報を保持しないため、メモリ使用量の増加についての問題はありません」って・・・うそじゃないか!>< *2