2026年10月2日

2026年10月2日

WordPressのメモリ不足エラーを解決する方法

はじめに

WordPressで「Fatal error: Allowed memory size of 134217728 bytes exhausted」エラーが表示される・画像のアップロードや一括処理でメモリ不足になる・wp-config.phpでWP_MEMORY_LIMITを設定しても効果がない・管理画面は動くがフロントエンドでメモリエラーが出る・どのプラグインがメモリを消費しているか特定できないといった問題は、PHP設定とWordPressのメモリ設定を正しく調整することで解決できます。

症状・原因

  • サーバーのphp.iniのmemory_limitがWordPressのWP_MEMORY_LIMITより低く設定されている
  • 大量の投稿データを取得するWP_Queryがメモリを大量消費している
  • 画像処理プラグイン(リサイズ・最適化)が高解像度画像でメモリを使い果たす
  • WP_DEBUGを有効にしているためデバッグ情報のメモリ消費が増加している

解決手順

ステップ1:メモリ使用状況を診断する

# 現在のPHPメモリ制限を確認
php -i | grep memory_limit

# WordPressのメモリ設定を確認
wp eval "
echo 'WP_MEMORY_LIMIT: '     . WP_MEMORY_LIMIT . PHP_EOL;
echo 'WP_MAX_MEMORY_LIMIT: ' . WP_MAX_MEMORY_LIMIT . PHP_EOL;
echo 'PHP memory_limit: '    . ini_get('memory_limit') . PHP_EOL;
echo 'Current usage: '       . round(memory_get_usage(true) / 1024 / 1024, 2) . 'MB' . PHP_EOL;
echo 'Peak usage: '          . round(memory_get_peak_usage(true) / 1024 / 1024, 2) . 'MB' . PHP_EOL;
"

# エラーログでメモリエラーを確認
grep -i "memory" /var/log/php/error.log | tail -20

# どのプロセスがメモリを消費しているか確認
wp eval "
\$plugins = get_option('active_plugins', []);
\$before = memory_get_usage();
echo 'Active plugins: ' . count(\$plugins) . PHP_EOL;
echo 'Memory before: ' . round(\$before / 1024 / 1024, 2) . 'MB' . PHP_EOL;
"

ステップ2:メモリ制限を引き上げる

// wp-config.php: WordPressのメモリ制限を設定
define('WP_MEMORY_LIMIT',     '256M');  // フロントエンド用
define('WP_MAX_MEMORY_LIMIT', '512M');  // 管理画面・一括処理用

// wp-config.php でPHPのメモリを直接変更(php.iniより優先される場合)
@ini_set('memory_limit', '256M');
# php.ini または .user.ini での設定
memory_limit = 256M

# .htaccess での設定(Apache + mod_php の場合)
# php_value memory_limit 256M
# wp-cli.yml でWP-CLIのメモリ設定
# wp-cli.yml:
# path: /var/www/html
# server: apache

# WP-CLIコマンドに一時的にメモリを追加
php -d memory_limit=512M $(which wp) <command>

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

// 大量データを処理する場合はバッチ処理で分割
function process_all_posts_in_batches(int $batch_size = 100): void {
    $offset = 0;

    do {
        $posts = get_posts([
            'posts_per_page'         => $batch_size,
            'offset'                 => $offset,
            'post_status'            => 'publish',
            'no_found_rows'          => true,
            'update_post_meta_cache' => false,
            'update_post_term_cache' => false,
            'fields'                 => 'ids',
        ]);

        foreach ($posts as $post_id) {
            // 個別の処理
            process_single_post($post_id);
        }

        // メモリを解放
        wp_cache_flush();
        $offset += $batch_size;

        // ピークメモリが閾値を超えたら停止
        if (memory_get_peak_usage(true) > 200 * 1024 * 1024) {
            error_log('Memory limit approaching, stopping at offset: ' . $offset);
            break;
        }
    } while (count($posts) === $batch_size);
}

ステップ4:プラグインのメモリ使用量を特定する

// 各プラグインのメモリ消費を計測
add_action('muplugins_loaded', function(): void {
    if (!defined('WP_DEBUG') || !WP_DEBUG) {
        return;
    }
    global $wp_memory_snapshots;
    $wp_memory_snapshots = [];
});

add_action('all', function(string $hook_name): void {
    if (!defined('WP_DEBUG') || !WP_DEBUG) {
        return;
    }
    // 重要なフックのメモリ使用量を記録
    $tracked_hooks = ['plugins_loaded', 'after_setup_theme', 'init', 'wp_loaded'];
    if (in_array($hook_name, $tracked_hooks, true)) {
        error_log(sprintf(
            '[Memory] %s: %sMB (peak: %sMB)',
            $hook_name,
            round(memory_get_usage(true) / 1024 / 1024, 2),
            round(memory_get_peak_usage(true) / 1024 / 1024, 2)
        ));
    }
}, 10, 1);

ステップ5:画像処理のメモリを最適化する

// 画像処理の上限解像度を設定
add_filter('big_image_size_threshold', function(int $threshold): int {
    return 2560;  // 2560px以上の画像はリサイズ(デフォルト2560)
});

// Imagickのメモリ制限を設定
add_filter('wp_image_editors', function(array $editors): array {
    // GDを優先(Imagickよりメモリ消費が少ない場合がある)
    return array_merge(
        array_filter($editors, fn($e) => $e === 'WP_Image_Editor_GD'),
        array_filter($editors, fn($e) => $e !== 'WP_Image_Editor_GD')
    );
});

// アップロード時の最大ピクセル数を制限
add_filter('wp_handle_upload_prefilter', function(array $file): array {
    if (str_starts_with($file['type'], 'image/')) {
        $image_size = getimagesize($file['tmp_name']);
        if ($image_size && $image_size[0] * $image_size[1] > 25_000_000) {
            $file['error'] = '画像のピクセル数が大きすぎます(最大2500万ピクセル)。';
        }
    }
    return $file;
});

注意事項

  • WP_MEMORY_LIMITで設定できる上限はphp.iniのmemory_limitの値です。サーバーのmemory_limitを超えて設定しても効果はありません
  • 共有ホスティングではサーバー管理者がmemory_limitを制限している場合があります。プランのアップグレードが必要な場合もあります

まとめ

WordPressメモリ不足エラーの解決は①php -i | grep memory_limitでPHP設定確認・memory_get_usage/peak_usageで現在のメモリ使用量を把握・エラーログでメモリエラーの頻度を確認、②WP_MEMORY_LIMIT=256M・WP_MAX_MEMORY_LIMIT=512Mをwp-config.phpに設定・php.iniや.htaccessでサーバー側のメモリ制限も引き上げ・@ini_set('memory_limit')で直接変更、③大量データはposts_per_page+offsetでバッチ処理・no_found_rows/update_post_meta_cache=falseでクエリを軽量化・wp_cache_flush()でバッチ間にメモリを解放、④plugins_loaded/initフックでメモリスナップショットを記録・消費量の多いプラグインを特定して代替を検討・Query Monitorでメモリプロファイリング、⑤big_image_size_thresholdで画像リサイズ閾値を設定・GDとImagickの使い分けでメモリを最適化・wp_handle_upload_prefilterで超高解像度画像のアップロードを制限の手順で解決します。

お気軽にご相談ください

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