2026年9月25日

2026年9月25日

WordPressのメモリ不足エラーを解決する方法【memory_limit設定】

はじめに

「Fatal error: Allowed memory size of X bytes exhausted」というエラーはWordPressでよく見られるメモリ不足エラーです。画像の大量処理、重いプラグイン、大規模なDBクエリなどが原因で起きます。

症状・原因

メモリ不足が起きる主なケース:

  • 大量の画像をメディアライブラリに一括アップロード
  • WooCommerceの注文一覧など大量データを表示
  • 多くのプラグインが同時に動作している
  • 共有ホスティングでPHPメモリ制限が低い

解決手順

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

# WP-CLIで現在のPHP設定を確認
wp eval "echo 'PHP memory_limit: ' . ini_get('memory_limit') . PHP_EOL;
echo 'WP_MEMORY_LIMIT: ' . WP_MEMORY_LIMIT . PHP_EOL;
echo 'WP_MAX_MEMORY_LIMIT: ' . WP_MAX_MEMORY_LIMIT . PHP_EOL;
echo '現在のメモリ使用量: ' . size_format(memory_get_usage(true)) . PHP_EOL;
echo 'ピーク時メモリ: ' . size_format(memory_get_peak_usage(true)) . PHP_EOL;"

# 設定確認
wp eval "phpinfo(INFO_GENERAL);" 2>/dev/null | grep memory

ステップ2:WordPressのメモリ制限を増やす

// 方法1: wp-config.php に追加(推奨)
define('WP_MEMORY_LIMIT', '256M');         // フロントエンドのメモリ上限
define('WP_MAX_MEMORY_LIMIT', '512M');     // 管理画面のメモリ上限

// 現在のメモリ使用量を監視する関数
function get_memory_usage_formatted(): string {
    $usage = memory_get_usage(true);
    $limit = wp_convert_hr_to_bytes(WP_MEMORY_LIMIT);
    $pct   = round(($usage / $limit) * 100);
    return size_format($usage) . " / " . WP_MEMORY_LIMIT . " ({$pct}%)";
}

// 管理バーにメモリ使用量を表示(開発時)
add_action('admin_bar_menu', function(WP_Admin_Bar $bar) {
    if (!current_user_can('manage_options') || !WP_DEBUG) return;
    $bar->add_node([
        'id'    => 'memory-usage',
        'title' => '🔧 Mem: ' . get_memory_usage_formatted(),
        'href'  => '#',
    ]);
}, 999);
; 方法2: php.ini を編集(サーバーへのアクセスがある場合)
memory_limit = 256M
max_execution_time = 120
post_max_size = 128M
upload_max_filesize = 64M
# 方法3: .htaccess に追加(共有ホスティング)
php_value memory_limit 256M
php_value max_execution_time 120

# CGIモードのサーバーの場合
# php_value は使えないので代わりに:
# php_flag display_errors off

ステップ3:メモリを消費するプラグインを特定する

// プラグインごとのメモリ使用量を測定
class Memory_Profiler {
    private static array $snapshots = [];
    
    public static function snapshot(string $label): void {
        self::$snapshots[$label] = memory_get_usage(true);
    }
    
    public static function report(): void {
        if (!WP_DEBUG_LOG) return;
        
        $prev = null;
        foreach (self::$snapshots as $label => $bytes) {
            if ($prev !== null) {
                $diff = $bytes - $prev;
                $sign = $diff > 0 ? '+' : '';
                error_log("[Memory] {$label}: " . size_format($bytes) . " ({$sign}" . size_format(abs($diff)) . ")");
            } else {
                error_log("[Memory] {$label}: " . size_format($bytes));
            }
            $prev = $bytes;
        }
    }
}

// プラグインのmemory hookにスナップショットを追加
add_action('muplugins_loaded', function() {
    Memory_Profiler::snapshot('mu_plugins_loaded');
});
add_action('plugins_loaded', function() {
    Memory_Profiler::snapshot('plugins_loaded');
}, PHP_INT_MAX);
add_action('after_setup_theme', function() {
    Memory_Profiler::snapshot('theme_loaded');
});
add_action('wp_loaded', function() {
    Memory_Profiler::snapshot('wp_loaded');
});
add_action('shutdown', ['Memory_Profiler', 'report']);

ステップ4:メモリ使用量を最適化する

// 1. 不要なデータをアンセットする
add_action('wp', function() {
    // WP_Queryの結果を使い終わったら解放
    // global $wp_query; // 必要な場合のみglobal使用
});

// 2. 画像処理のメモリ上限を動的に増やす
add_filter('wp_handle_upload', function($file) {
    // 画像アップロード時だけメモリを増やす
    $current = ini_get('memory_limit');
    if (wp_convert_hr_to_bytes($current) < wp_convert_hr_to_bytes('512M')) {
        ini_set('memory_limit', '512M');
    }
    return $file;
});

// 3. 大量投稿の処理にバッチ処理を使う
function process_posts_in_batches(callable $callback, int $batch_size = 100): int {
    $offset    = 0;
    $processed = 0;
    
    do {
        $posts = get_posts([
            'posts_per_page' => $batch_size,
            'offset'         => $offset,
            'fields'         => 'ids',
            'post_status'    => 'publish',
        ]);
        
        foreach ($posts as $post_id) {
            $callback($post_id);
            $processed++;
        }
        
        // バッチ処理後にガベージコレクション
        wp_cache_flush();
        $offset += $batch_size;
        
    } while (count($posts) === $batch_size);
    
    return $processed;
}

ステップ5:WP-CLIでメモリ問題を診断する

# メモリを多く使うWP-CLIコマンドにメモリ上限を設定
wp --memory=512M media regenerate

# プロセスのメモリ使用量をリアルタイム確認
watch -n 1 "ps aux | grep php | grep -v grep | awk '{print \$4, \$11}'"

# PHP-FPMのメモリ設定を確認
grep "memory_limit" /etc/php/8.2/fpm/php.ini
grep "memory_limit" /etc/php/8.2/cli/php.ini

# PHP-FPMを再起動して設定を反映
systemctl restart php8.2-fpm

# 設定が反映されたか確認
wp eval "echo ini_get('memory_limit');"

注意事項

  • メモリ制限を無制限(-1)にするのは避けてください。無限ループが発生した場合にサーバー全体に影響します
  • 共有ホスティングではサーバー側の上限を超えることはできません
  • メモリ増加は根本解決ではなく、メモリを多く使うコードの最適化が長期的には重要です

まとめ

WordPressのメモリ不足エラーは、①WP_MEMORY_LIMITの定数設定、②php.iniまたは.htaccessでのPHP設定、③プロファイラによるメモリ消費プラグインの特定、④バッチ処理による大量データの分割処理、⑤wp-cliでの診断で解決します。

お気軽にご相談ください

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