PHPの「Out of memory」エラーをメモリ増加で解決する
発生状況の例
管理画面を操作中に以下のようなエラーが出ることがあります。
*PHP Fatal error: Out of memory (allocated 49545216) (tried to allocate 77824 bytes) in /home/xxxxx/public_html/xyz/admin.php(1758) on line 40*
この例ではApacheを再起動して一時的に復旧しましたが、再発する可能性があります。再起動は一時的なメモリ解放に過ぎません。
なぜこのエラーが起きるか
PHPはスクリプトごとに利用できるメモリ上限をmemory_limitで制御します。スクリプトがその上限を越えてメモリ確保を試みると「Out of memory」エラーになります。大量データ処理、外部ライブラリのバグ、メモリリーク、またはデフォルト上限が小さい(例: memory_limit = 8M)ことが原因です。
重要: メモリ上限を上げることは根本改善にならない場合があります。まずはどのスクリプトが大量メモリを使っているか特定してください。
解決手順 — PHPメモリを増やす4つの方法
以下は一般的に使える順序です。環境(mod_php, PHP-FPM, 共有ホスティング)により使える方法が変わります。
- php.ini を編集する(推奨、恒久対応)
- サーバー上で読み込まれているphp.iniを特定します。ルートに以下の確認用ファイルを置いてブラウザで実行すると場所がわかります。
- 通常のパス例: /usr/local/lib/php.ini
- php.iniをテキストエディタで開き、memory_limit を探します。デフォルトが memory_limit = 8M なら、まず 12M に上げ、必要に応じて 16M、32M と段階的に上げてください。
- スクリプト内で一時的に増やす(テストや限定対応向け)
管理画面を投げているスクリプト(例: admin.php)の先頭付近に次を追加します。
ini_set('memory_limit', '12M');
この方法はそのスクリプト実行時だけ有効です。恒久的な対策ではありませんが、動作確認や緊急回避に便利です。
- .htaccess に設定を追加する(Apache + mod_php の場合)
ルートまたは該当ディレクトリの .htaccess に次を追加します。
php_value memory_limit 32M
共有ホスティングやサーバー構成によっては .htaccess での変更が無効化されている場合があります。
- WordPress の場合は wp-config.php に定義する
WordPressサイトなら wp-config.php に次を追加して試せます。
define('WP_MEMORY_LIMIT', '32M');
ただしホスト側で PHP の上限を厳格に設定している場合、これでも効果が出ないことがあります。
トラブルシューティングと運用のベストプラクティス
- まず現在の設定値を確認する: phpinfo() またはスクリプト内で echo ini_get(‘memory_limit’);
- 増やしても解決しない場合は、該当スクリプトのメモリ使用をプロファイルしてください。大量ループや配列の肥大化が原因のことがあります。
- PHP-FPM を使っている場合は php-fpm のプール設定(/etc/php//fpm/pool.d/.conf)や FPM の php.ini を確認する必要があります。Apache 再起動は一時的に回復するだけで、FPM プロセスの再起動が必要なケースもあります。
- 共有ホスティングではホストが「ハードリミット」を設けていることがあります。その場合はホスト側に相談して上限を上げてもらうか、上位プランへの移行を検討してください。
重要: メモリを無制限に増やすのは避けてください。増やす前にまずは根本原因(コードの最適化やキャッシュ導入)を検討します。
いつホストに連絡すべきか
- .htaccess や wp-config で増やしても効果がない場合
- サーバーレベルのハードリミット(例: コンテナ/cPanel 設定)が疑われる場合
- CPUやメモリ不足でサービス全体に影響が出ている場合
好ましい問い合わせ内容: エラーログの該当行、実行時間、試した対処(php.ini編集、ini_set、.htaccess変更)を書くと対応が早くなります。
追加の考え方と代替アプローチ
- コード最適化: 大きな配列を都度解放する、ストリーミング処理に切り替える、不要なプラグインを無効化する。
- キャッシュ導入: OPcache、ページキャッシュ、オブジェクトキャッシュでメモリ負荷を低減する。
- バッチ処理化: 一度に大量データを処理しないよう分割する。
- ハードな対策: メモリ増設や上位プランへ移行。
反例(メモリ増加が効かない場合):
- スクリプトにメモリリークがある(無限に増えるデータ構造)
- ホストが上限を強制している
運用者向けチェックリスト
- phpinfo() で読み込まれる php.ini の場所を確認
- 該当スクリプトに ini_get(‘memory_limit’) を使って実行時値を確認
- 一時的に ini_set か .htaccess で値を上げて再現確認
- ログ(error_log)をチェックして別エラーがないか確認
- 根本原因調査(プロファイラ、xdebug、メモリプロファイラ)
- 必要ならホストやインフラ担当へエスカレーション
受け入れ基準
- 管理画面がエラーなく表示されること
- 同等の操作(同じボタンやページ遷移)で再発しないこと
- ログにOut of memoryが残らないこと
1行用語集
- memory_limit: PHPが1スクリプトに割り当てる最大メモリ量(例: 32M)。
- Apache httpd: Webサーバーの一つ、mod_phpではプロセス内でPHPが動作する。
- PHP-FPM: FastCGIプロセスマネージャ、プロセス単位でPHPを管理する。
まとめ: エラーが出たらまずは一時回避で動作確認し、恒久的にはphp.iniやFPM設定の確認、コード最適化、必要ならホストと協力して上限設定を行ってください。
Image Courtesy: Clarkandransom