PHPのメモリ上限エラー対処法
冒頭まとめ PHPの処理が、次のエラーで止まることがあります。 PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 20480 bytes) in /var/www/app/index.php on line 42 PHPに設定されたメモリの上限を超えたことを示します。まず、エラーを出した実行環境で有効な memory_limit を確認し、処理のどこでメモリが増えるかを調べます。 必要な処理量に対して上限が足りなければ調整します。ただし、memory_limit = -1 にするとPHP側の制限がなくなります。エラーを消すためだけに、Webアプリ全体の上限を外す方法は避けてください。 最初の数字は上限で括弧内は追加確保量 例の 134217728 bytes は上限です。128M をバイトに直した値に当たります。tried to allocate 20480 bytes は、その時点で追加して確保しようとした量です。 PHP 8.4.27の実装では、文言の最初にメモリの上限、括弧内に追加確保量を渡しています。括弧内の量が小さくても、それまでに確保した量が上限近くに達していれば失敗します。 表示されたファイルと行番号は調査の手がかりですが、その行だけが大量にメモリを使ったとは限りません。前の処理から保持しているデータも確認対象です。 PHPマニュアルに記載された memory_limit の既定値は 128M です。ただし、配布元やサーバー、アプリの設定で変更されるため、実際の値を確認してください。 CLIとWebで有効な設定をそれぞれ確認する コマンドラインで実行した処理なら、次でPHPの版、読み込む設定ファイル、現在の上限を確認します。 php -v php --ini php -r "echo ini_get('memory_limit'), PHP_EOL;" 設定ファイルの公式説明では、PHPの実行方法による設定ファイルの指定や、追加のiniファイルの読み込みが説明されています。CLIの値を見ただけで、Web経由でも同じ設定とは判断できません。 Webの処理で失敗する場合は、そのアプリの診断機能や、管理者だけが実行できる確認処理を使います。たとえば対象の処理内で、次の値をログに記録します。 <?php error_log('PHP=' . PHP_VERSION . ' SAPI=' . PHP_SAPI); error_log('memory_limit=' . ini_get('memory_limit')); error_log('php.ini=' . (php_ini_loaded_file() ?: '(none)')); 確認用の処理は公開したまま残さず、調査後に外してください。設定ファイルを編集した場合も、同じ実行経路で値が変わったかを確認します。必要な再読み込みや再起動は、PHP-FPMやApacheなどの実行方式に合わせて行います。 メモリが増える処理を記録して絞り込む 処理の前後で使用量を記録します。memory_get_usage()は現在の使用量、memory_get_peak_usage()は最大使用量を返します。 <?php function logMemory(string $label): void { error_log(sprintf( '%s: usage=%d peak=%d bytes', $label, memory_get_usage(true), memory_get_peak_usage(true) )); } logMemory('before'); // 調べたい処理をここに置く logMemory('after'); true を渡した場合は、PHPがシステムから確保した領域の量を返します。ただし、拡張機能がPHPのメモリ管理を通さずに確保した領域などは含まれず、OSが見るプロセス全体の使用量とは一致しません。 ...