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を一時的に変更しているような場合は少し工夫が必要になります。
何かのお役にたれれば幸いです。