MeWrite Docs

PHP Fatal error: Allowed memory size exhausted

PHPでメモリ制限を超えた場合に発生するエラー

概要

PHPスクリプトがphp.iniで設定されたメモリ制限を超えた場合に発生するエラーです。

エラーメッセージ

PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 65536 bytes)

原因

  1. 大量のデータ処理: 大きなファイルや配列をメモリに読み込み
  2. 無限ループ: 終了しないループでメモリを消費し続ける
  3. メモリリーク: オブジェクトが解放されない
  4. 再帰の深さ: 深い再帰呼び出し

解決策

1. php.ini でメモリ制限を増加

1
2
; php.ini
memory_limit = 256M

2. スクリプト内で一時的に増加

1
ini_set('memory_limit', '256M');

3. .htaccess で設定(Apache)

1
php_value memory_limit 256M

4. 大きなファイルはストリーム処理

1
2
3
4
5
6
7
8
9
// 悪い例:全体をメモリに読み込む
$content = file_get_contents('large_file.csv');

// 良い例:1行ずつ処理
$handle = fopen('large_file.csv', 'r');
while (($line = fgets($handle)) !== false) {
    // 1行ずつ処理
}
fclose($handle);

5. データベースクエリの最適化

1
2
3
4
5
6
7
8
9
// 悪い例:全レコードを取得
$users = User::all();

// 良い例:チャンク処理
User::chunk(1000, function ($users) {
    foreach ($users as $user) {
        // 処理
    }
});

6. 不要な変数を解放

1
2
3
$largeData = getLargeData();
processData($largeData);
unset($largeData);  // メモリを解放

7. ジェネレーターを使用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
function readLargeFile($filename) {
    $handle = fopen($filename, 'r');
    while (!feof($handle)) {
        yield fgets($handle);
    }
    fclose($handle);
}

foreach (readLargeFile('large.csv') as $line) {
    // 処理
}

よくある間違い

  • 開発環境と本番環境でメモリ制限が異なる
  • Composerのメモリ不足(COMPOSER_MEMORY_LIMIT=-1)
  • 画像処理ライブラリのメモリ消費を考慮していない

PHP の他のエラー

最終更新: 2025-12-09