本文へスキップ
設定

WordPress の「Allowed Memory Size Exhausted」エラーを解決する

サイトに Fatal error: Allowed memory size of 268435456 bytes exhausted と表示される場合は、wp-config.php の / That's all, stop editing! / の上にこの一行を追加してください。

公開

サイトに Fatal error: Allowed memory size of 268435456 bytes exhausted と表示される場合は、wp-config.php/* That's all, stop editing! */ というコメントの上に次の一行を追加してください。define( 'WP_MEMORY_LIMIT', '256M' ); です。ほとんどのサイトはこれで1分以内に復旧します。ただし、そのまま立ち去る前にこのページの残りにも目を通してください。上限を引き上げるのは診断であって、根本的な治療ではないからです。より大きな数値でまたクラッシュするなら、本当の原因はメモリを際限なく消費しているコードにあり、上限を上げることはそのコードに余分な猶予を与えているだけです。

このエラーが実際に意味すること

PHP は各リクエストがどれだけメモリを確保したかを追跡しています。1つのリクエストが php.ini で設定された(または WordPress によって上書きされた)memory_limit を超えて確保しようとすると、PHP はそのリクエストを即座に停止し、致命的エラーとともに、その時点で確保に失敗したバイト数を出力します。268435456 bytes は 256M、134217728 は 128M、536870912 は 512M です。「tried to allocate」に続く数値は、最後のひと押しとなった確保サイズを示すものであって、問題の大きさそのものを表すわけではありません。

WordPress は PHP の上限の上に独自の上限を重ねています。WP_MEMORY_LIMIT(デフォルト 40M、または PHP の上限がそれより大きければそちら)はフロントエンドを制御します。WP_MAX_MEMORY_LIMIT(デフォルト 256M)は、メディアライブラリやプラグインの更新など、正当により多くのメモリを必要とする管理画面側の処理を制御します。WordPress は読み込み時にこれらの定数に基づいて ini_set('memory_limit', ...) を呼び出しますが、それはホストが ini_set を許可している場合、かつホストが設定した上限の範囲内に限られます。この最後の点こそが、wp-config.php を編集しても何も変わらないように見えることがある理由です。

順番に解決していく

1. wp-config.php で WordPress の上限を引き上げる。 これはやり直しがきき、他の何にも影響しないため、最初に試すべき方法です。

define( 'WP_MEMORY_LIMIT', '256M' );
define( 'WP_MAX_MEMORY_LIMIT', '512M' );

これらの行をどこに置けばよいか分からない場合や、よく使われる他の定数も同時に正しく設定したい場合は、wp-config generator が貼り付けるだけで使えるきれいなコードブロックを生成します。配置場所は重要です。「stop editing」の行より下に書いたものはすべて無視されます。

2. これで何も変わらないなら、ホストが PHP 側で上限をかけています。 PHP レベルで memory_limit を引き上げてください。php.ini では次のようにします。

memory_limit = 256M

多くの共用ホスティングでは php.ini を直接編集できません。その場合は Web ルートに .user.ini ファイルを置く方法を試すか、Apache/mod_php 環境なら .htaccess で設定します。

php_value memory_limit 256M

なお、.htaccessphp_value は Apache/mod_php 用のディレクティブなので、nginx や PHP-FPM の環境では 500 エラーを引き起こします。追加後に 500 エラーが出たらこれが原因です。その行を削除して .user.ini を使ってください。

3. 実際に有効になっている値を確認する。 自分が編集した内容ではなく、PHP が報告する値を信じてください。Web ルートに一行だけのファイルを置きます。

<?php echo ini_get('memory_limit');

これをブラウザで読み込み、値を確認したら、ファイルを削除します。256M に設定したのにまだ 128M と表示されるなら、ホストが設定を上書きしています。ホストに問い合わせるか、ホストのコントロールパネルの設定を使う必要があります。

ほとんどのガイドが飛ばす部分

上限を引き上げるのは診断です。ここでは、その結果の読み解き方を説明します。

256M に設定して、通常のトラフィックでサイトが安定して稼働するなら、正当な上限が単に低すぎただけです。これは大きなメディアライブラリを持つサイト、WooCommerce、ページビルダーを使っているサイトでよく起こります。これで対応は完了です。

256M に設定してもまたクラッシュし、512M にしてもまたクラッシュするなら、それ以上引き上げるのはやめてください。 通常の WordPress リクエストに 512M は必要ありません。メモリ使用量が上限なく増え続ける場合、何かがループしているか蓄積し続けています。データベーステーブル全体を配列に読み込んでいるプラグイン、自分自身を再帰的に呼び出す add_action、全行を一度にメモリに保持するインポート処理、あるいは同じフックの中で競合している2つのプラグインなどです。上限を引き上げても際限のないループは直りません。クラッシュを数秒遅らせて再現しづらくするだけです。

原因を突き止めるには、すべてのプラグインを停止し、Twenty Twenty-Four のようなデフォルトテーマに切り替えます。エラーが止まったら、1つずつ有効化し直して、再発するまで確認します。どこで停止しているかを捉えるために、デバッグログを有効にします。

define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );

wp-content/debug.log の致命的エラーの行には、最後のメモリ確保を行ったファイル名と行番号が記録されています。それが通常はループそのものか、ループから関数呼び出し1つ分の場所です。

やってはいけないこと

WP_MEMORY_LIMIT-11024M に設定してそのまま放置しないでください。 無制限のメモリはリークを直しません。暴走したリクエストにサーバー全体を食い尽くさせることになり、同じマシン上の他のすべてのサイトを巻き込んでダウンさせ、ホストから連絡が来る事態になりかねません。上限は安全装置です。必ず1つは残しておいてください。

ini_set('memory_limit', '512M') を主要な対策として functions.php に貼り付けないでください。 これは一部の障害には実行が遅すぎます。クラッシュがテーマの functions.php が実行される前の WordPress コア読み込み中に起きる場合、その行は決して実行されません。wp-config.php はより早く読み込まれるため、こちらが正しい場所です。

ホスティングの問題だと決めつけてプランをアップグレードしないでください。 本当にホスティングの容量不足であることもあります。しかし、原因がプラグインに紛れて一緒に付いてくるため、まったく同じクラッシュが上位プランにも付いてくることがよくあります。まずはループを除外しましょう。それは無料です。

max_execution_time のエラーを直すために memory_limit を引き上げないでください。 これらは別々の上限で、メッセージも異なります。メモリの枯渇は「Allowed memory size … exhausted」と表示されます。タイムアウトは「Maximum execution time … exceeded」と表示されます。間違った方を引き上げると、午後まるごとを無駄にすることになります。

それでも解決しないなら

有効な上限が本当に 256M 以上であることを確認し、すべてのプラグインを停止しデフォルトテーマでテストしても、なおメモリを使い切ってしまうなら、引き上げるべき上限の問題ではなく、デバッグログで追いかける価値のある本物のリークを抱えています。致命的エラーの行をキャプチャし、それがどのプラグインのディレクトリを指しているかをメモしてください。それがあなたのバグレポートになります。まずは wp-config generator で基本となる wp-config.php の定数を正しく整え、上限が自分の思っているとおりに設定されていることを確かめてから、ログを読みに行きましょう。