読者です 読者をやめる 読者になる 読者になる

肉とビールとパンケーキ by @sotarok

少し大人になった「肉とご飯と甘いもの」

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

*1:だってデバッグ画面のオプションにあるもんねえ。。

*2:原文doc通りなので、そもそもドキュメントが間違ってるのかな・・・それとも・・・