2026年5月27日

2026年5月27日

WordPressで「Allowed memory size exhausted」エラーを解決する方法

はじめに

「Fatal error: Allowed memory size of 134217728 bytes exhausted」はWordPressがPHPに割り当てられたメモリを使い切ったときに発生します。プラグインの追加・大きな画像処理・複雑なクエリが引き金になることが多く、メモリ上限の引き上げで解決できます。

症状・原因

  • 管理画面やフロントエンドに「Fatal error: Allowed memory size exhausted」が表示される
  • 大きな画像をアップロードしたときや、特定のページで白い画面になる
  • プラグインのアップデート後にエラーが頻発するようになった
  • メモリを大量消費するプラグイン(WooCommerce・Elementor等)を入れた後から発生

解決手順

ステップ1:現在のメモリ使用量を確認する

# WP-CLI で現在のメモリ上限を確認
wp eval "echo ini_get('memory_limit'), PHP_EOL;"
wp eval "echo WP_MEMORY_LIMIT, PHP_EOL;"

# PHP のメモリ使用量をリアルタイムで確認
wp eval "echo memory_get_usage(true) / 1024 / 1024, 'MB used', PHP_EOL;
         echo memory_get_peak_usage(true) / 1024 / 1024, 'MB peak', PHP_EOL;
         echo ini_get('memory_limit'), ' limit', PHP_EOL;"
// wp-config.php に追加してデバッグ用にメモリ使用量を表示
add_action('shutdown', function(): void {
    if (current_user_can('administrator')) {
        $peak = memory_get_peak_usage(true) / 1024 / 1024;
        error_log(sprintf('[memory] peak: %.1fMB / limit: %s', $peak, ini_get('memory_limit')));
    }
});

ステップ2:wp-config.php でメモリ上限を引き上げる

// wp-config.php: WordPress のメモリ設定を引き上げる
// ※ require_once ABSPATH . 'wp-settings.php'; の前に記述すること

// フロントエンドのメモリ上限(デフォルト: 40MB)
define('WP_MEMORY_LIMIT', '256M');

// 管理画面のメモリ上限(デフォルト: 256MB)
define('WP_MAX_MEMORY_LIMIT', '512M');

ステップ3:php.ini または .htaccess で設定を変更する

# php.ini(サーバー全体に適用)
memory_limit = 256M
# .htaccess(Apache + mod_php の場合、サイトごとに設定)
php_value memory_limit 256M
# .user.ini(PHP-FPM 環境、共有ホスティングでよく使われる)
memory_limit = 256M
# 設定変更後に PHP のメモリ上限が反映されているか確認
php -r "echo ini_get('memory_limit');"

# PHP-FPM の場合は再起動が必要
systemctl reload php8.2-fpm

# WP-CLI で確認
wp eval "echo ini_get('memory_limit');"

ステップ4:メモリを消費しているプラグインを特定する

// functions.php: 各フック実行後のメモリ使用量をログに記録
add_action('all', function(string $hook): void {
    static $prev = 0;
    $current = memory_get_usage(true);
    $diff = $current - $prev;
    if ($diff > 1048576) { // 1MB 以上増加したフックをログ
        error_log(sprintf('[memory] +%.1fMB after hook: %s (total: %.1fMB)',
            $diff / 1024 / 1024,
            $hook,
            $current / 1024 / 1024
        ));
    }
    $prev = $current;
}, 1);
# プラグインを1つずつ無効化してメモリ消費を確認
wp plugin deactivate --all

# プラグインを1つずつ有効化して原因を特定
wp plugin activate woocommerce
wp eval "echo memory_get_peak_usage(true) / 1024 / 1024, 'MB';"

# Query Monitor プラグインでメモリ使用量を視覚的に確認
wp plugin install query-monitor --activate

ステップ5:メモリ消費を最適化する

// functions.php: 不要なデータを早めに解放する
add_action('wp_loaded', function(): void {
    // 管理画面でない場合は不要な機能を無効化
    if (!is_admin()) {
        // emojiスクリプトを無効化(メモリ節約)
        remove_action('wp_head', 'print_emoji_detection_script', 7);
        remove_action('wp_print_styles', 'print_emoji_styles');
    }
});

// 大量の投稿を処理する場合はループ後にキャッシュをクリア
add_action('loop_end', function(): void {
    wp_cache_flush_group('posts');
});

// WP_Query でメモリを節約するオプション
$query = new WP_Query([
    'posts_per_page'         => 100,
    'no_found_rows'          => true,  // ページネーション不要なら
    'update_post_meta_cache' => false, // postmeta をキャッシュしない
    'update_post_term_cache' => false, // タームをキャッシュしない
    'fields'                 => 'ids', // ID のみ取得
]);

注意事項

  • WP_MEMORY_LIMITの設定はサーバーのmemory_limitより大きくすることはできません。まずサーバー側(php.ini/.htaccess/.user.ini)で制限を引き上げてから、WordPressの設定を変更してください
  • メモリを際限なく増やすのは根本解決になりません。512MBを超えてもまだ不足する場合はメモリリーク(解放されないオブジェクトの蓄積)が疑われるため、プラグインの問題調査や、バッチ処理のチャンク分割を検討してください
  • 共有ホスティングではメモリ上限を変更できない場合があります。その際はVPSやクラウドサーバーへの移行を検討してください

まとめ

メモリ不足エラー解決は①wp eval "echo ini_get('memory_limit')"memory_get_peak_usage()で現在の使用量を把握、②wp-config.phpWP_MEMORY_LIMIT='256M'WP_MAX_MEMORY_LIMIT='512M'を追加、③php.iniまたは.htaccessmemory_limitをサーバーレベルで引き上げ、④add_action('all', ...)でフック別メモリ消費をログ化してプラグインの原因を特定、⑤WP_Queryno_found_rows・update_post_meta_cache=false・fields='ids'を指定してクエリのメモリ消費を削減します。

お気軽にご相談ください

お見積りへ お問い合わせへ