PHPでメモリ関連でエラーが出たとき -Allowed memory size-

PHPでエラーが発生した場合、エラーの内容と事象が発生したプログラムの行数を表示させることができるが、WindowsサーバでIISを使っているとPHPから出すエラーが表示されずにIISが出す"500"エラーが表示された。

ブラウザ上では「500 -内部サーバーエラーです。」としか表示されず、OSのデスクトップ上にはPHPが強制終了したダイアログが表示される。

 500内部エラー


WindowsサーバでPHPを利用する場合、デフォルトの設定では「C:\Windows\Temp\php-errors.log」としてエラーファイルが書き出される。

ログを確認すると「PHP Fatal error: Allowed memory size of [メモリ数] bytes exhausted (tried to allocate 35 bytes) in [ソースのパス] on line [エラー行数]」という形で残っていた。

エラーの内容からはメモリが足らないと解釈でき、php.iniでPHPが利用するメモリ数を増やせば解決しそうだが、この時の設定値は128Mを割り振っており、エラーが発生しないときのアプリ動作も遅延が気にならなかったのでどうもメモリの設定値では解決しない気がした。

場合によっては無限ループでメモリが足らないと出ることもあるかもしれないが、その場合はWebサーバが応答しなくなり、500エラーすら返ってこないと思われる。

ちょうど1ステップずつ処理を書き加えながら動作検証していて、SQLを変更した時に発生したのでSQLが原因なのは想像がついた。

結局のところ、pg_get_serial_sequenceで指定したシリアルナンバー数とインサート時のレコード数が不一致で500エラーが出たようだ。


具体的にはリストアによりcreatetableとデータの登録を一括で行う際に、serialをカラムに設定したテーブルにpg_get_serial_sequenceでは2としておきながら実際のデータレコードを3以上入れてしまい、アプリケーションからレコードを追加しようとしてserialの計算ができない状態になった。


確かにSQLを実行しようとがんばってメモリが足らなくなったのだろうと思うと納得できそうだが、せめてDB関連のログで残してくれればと思う。

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 0

この記事へのコメント

この記事へのトラックバック