2020-12-16に更新

【php】Fatal error: Out of memory が出たときの、原因特定の準備

PHP

社内ツール開発中、追加機能の実装が出来たので意気揚々と本番にデプロイした結果。

Fatal error: Out of memory

ウワァァァァ

頭を抱えていたら、とりあえずの対処法と原因特定するための方法をパイセンに教えていただいたので記録。

①とりあえずphp.iniをいじる

参考:PHPのメモリの上限を変更する

;memory_limit = 256M  ←翌朝、128から256に変更してみた
memory_limit = 512M  ←256でも同エラーになったので、更に上げてみた

128Mから256Mに引き上げたものの、
数時間後に同エラーが発生したため解決にはならず。
おそらく意味はないと思われるが、512Mまで引き上げて様子見…

(そもそもメモリ上限を上げただけでは根本的な解決にはならない。)

②原因だと思われるメソッドのメモリ使用量を計測する

参考:php メモリ使用量測定メモ

memory_get_usage() で現在のメモリ使用量
memory_get_peak_usage()  でメモリ使用量の最大値
をそれぞれ取得できる。

これを使って、実行前後のメモリ使用量をLogに吐き出すように仕込んでみた。

public function hoge() {
  \Log::debug("first:".memory_get_usage() / (1024 * 1024)."MB\n");

  // なにかの処理…

  \Log::debug("now:".memory_get_usage() / (1024 * 1024)."MB\n");
  \Log::debug("peak:".memory_get_peak_usage() / (1024 * 1024)."MB\n");
}

※laravelを使っているので\Log::debug()で書いています。

次エラーが発生した際に、メモリ使用量がとてつもないことになっている箇所があればおそらくそれが原因。
そうでもなければ、別の場所が原因なので、仕込む場所を変えてみる

…という風に原因特定していくらしい。
ひとまずは、この状態でログとにらめっこしつつ原因特定を頑張るぞ。

ツイッターでシェア
みんなに共有、忘れないようにメモ

みみみみみ

2歳と2ヶ月くらいの赤ちゃんです。

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント