LoginSignup
2
2

More than 1 year has passed since last update.

PHPでメモリを使いすぎてたらアラート飛ばす

Last updated at Posted at 2021-07-29

php.iniのmemory_limitの設定値以上のメモリを使用した場合、
『Fatal error : Allowed memory size of ...』のエラーになってしまいますが、
エラー発生の兆候をキャッチしておくことで、事前に対応を入れることができます。

今回はregister_shutdown_functionを利用して、
メモリ使用量がmemory_limit値に近い場合はアラートを飛ばす簡単な例を紹介します。

function checkMemory() {
    // memory_limit値を取得
    $limit = ini_get('memory_limit');

    // 設定値は『128M』のような文字列なので、数値と単位に分ける
    // 『128.8A』など、小数だったり不正な単位が付いてたりする場合も、とにかくint型にキャストされる
    $byte = (int) $limit;
    $unit = strtoupper(substr($limit, -1));

    // 数値と単位からバイト数を算出
    switch ($unit) {
    case 'G':
        $byte *= 1024;
    case 'M':
        $byte *= 1024;
    case 'K':
        $byte *= 1024;
    }

    // memory_limitの下限値が存在しているため、下限値未満は下限値が自動的に割り当てられる
    // マイナス値はmemory_limit無制限になるため下限値を割り当てない
    // PHP8=2M PHP7=2M PHP5=256K
    $min = 2 * 1024 * 1024;
    if (0 <= $byte && $byte < $min) {
        $byte = $min;
    }

    // memory_get_peak_usageはPHPによって割り当てられたメモリの最大値
    // その最大値がmemory_limit値の90%を超えていたらアラート飛ばす
    if (memory_get_peak_usage() / $byte > 0.9) {
        // ログ残す、メール飛ばす、などお好みの処理を
    }
}
register_shutdown_function(function () {
    checkMemory();
});

スクリプト内でmemory_limitを一時的に変更しているような場合は少し工夫が必要になります。

何かのお役にたれれば幸いです。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2