PHPのエラー『Fatal Error: Allowed Memory Size Exhausted』の解決方法

「Fatal Error: Allowed Memory Size Exhausted」は、PHPスクリプトが設定されたメモリ制限を超えたときに発生します。このエラーが発生すると、処理を続けることができず、PHPスクリプトが終了します。原因と解決策を詳しく解説します。
1. エラーの発生条件
このエラーは、以下のような場合に発生します。
- PHPスクリプトが大量のメモリを消費し、設定されたメモリ制限を超えた場合
- 無限ループや過剰なメモリ使用を引き起こすコードが含まれている場合
- 大きなファイルを読み込む、または大量のデータを処理する際にメモリ制限を超過する場合
2. エラーが発生するコード例
以下のコードは、無限ループや過剰なメモリ使用を引き起こし、「Fatal Error: Allowed Memory Size Exhausted」を発生させる例です。
<?php
// 無限ループによるメモリ超過
$largeArray = [];
while (true) {
$largeArray[] = str_repeat("A", 1000000);
}
?>
このコードでは、無限に配列にデータを追加し続け、メモリを消費し尽くします。
3. 解決策1: メモリ制限を増やす
エラーが発生した場合、PHPのメモリ制限を増やすことで解決できる場合があります。`php.ini` ファイルまたはスクリプト内で設定を変更できます。
- php.ini ファイルでメモリ制限を変更する方法:
- スクリプト内でメモリ制限を変更する方法:
上記の設定で、PHPスクリプトが使用できるメモリ量を増やすことができます。
4. 解決策2: メモリ使用量を最適化する
メモリの使用量を最適化することで、エラーを防ぐことができます。例えば、大きな配列やオブジェクトを扱う場合、不要なデータを削除したり、データをファイルに書き出してメモリから解放する方法があります。
<?php
// 配列のサイズを制限してメモリ使用量を減らす
$data = [];
for ($i = 0; $i < 1000000; $i++) {
$data[] = $i;
if (count($data) > 100000) {
array_shift($data); // 不要なデータを削除
}
}
?>
5. 解決策3: バッチ処理で処理を分ける
大量のデータを処理する場合、バッチ処理に分けて一度に処理するデータ量を減らす方法が有効です。これにより、一度に消費するメモリ量を減らすことができます。
<?php
// バッチ処理でデータを分割して処理
$data = range(1, 1000000);
$batchSize = 10000;
for ($i = 0; $i < count($data); $i += $batchSize) {
$batch = array_slice($data, $i, $batchSize);
// バッチ処理を実行
processBatch($batch);
}
function processBatch($batch) {
// 処理内容
}
?>
6. 解決策4: ファイル処理でメモリ使用量を減らす
大きなファイルをメモリに一度に読み込む代わりに、`fopen()` や `fgetcsv()` を使って逐次的に読み込む方法が有効です。
<?php
// ファイルを逐次的に読み込む
$handle = fopen('largefile.txt', 'r');
while (($line = fgets($handle)) !== false) {
// 各行の処理
}
fclose($handle);
?>
7. 解決策5: 無限ループや再帰の使用を避ける
無限ループや過剰な再帰を使用すると、メモリを大量に消費し、メモリ制限を超えてしまうことがあります。処理のロジックを見直して、無限ループや再帰の使用を避けることが重要です。
<?php
// 再帰を使う代わりにループを使用
function calculate($n) {
$result = 1;
for ($i = 1; $i <= $n; $i++) {
$result *= $i;
}
return $result;
}
echo calculate(10);
?>
8. 解決策6: スクリプトのログ出力を減らす
デバッグのために大量のログ出力を行うことが、メモリ消費の原因となる場合があります。エラーログやデバッグ情報を必要最低限にすることで、メモリの消費を抑えることができます。
9. 解決策7: PHPのガベージコレクションを活用する
PHPには自動的にメモリを解放するガベージコレクションが搭載されていますが、明示的に `gc_collect_cycles()` を呼び出してメモリを解放することもできます。
<?php
// ガベージコレクションを手動で呼び出す
gc_collect_cycles();
?>
10. 解決策8: メモリ消費の大きな処理を外部ツールに委任する
メモリ消費の大きな処理をPHP内で行うのではなく、外部ツールやシステム(例: Pythonスクリプトやデータベース)に委任して処理することで、メモリの使用量を大幅に減らすことができます。
-
前の記事
Rubyのエラー『Interrupt: interrupted from sleep』の解決方法 2025.03.11
-
次の記事
PyCharm 設定ウィンドウを開くショートカットキー 2025.03.11
コメントを書く