2026年5月28日

2026年5月28日

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

はじめに

WordPressの管理画面を開いたり投稿を保存しようとするとFatal error: Allowed memory size of 134217728 bytes exhaustedエラーが表示されて操作できない・メディアライブラリで大量の画像を扱ったり一括処理をするとPHPがクラッシュする・wp-config.phpWP_MEMORY_LIMITを設定してもエラーが変わらない・特定のプラグインを有効化するとメモリが急増するといった問題は、PHPのmemory_limit設定・プラグインのメモリリーク・画像処理ライブラリの設定が原因です。

症状・原因

  • PHPのmemory_limitがサーバーのデフォルト(128M等)のままで不足している
  • 特定のプラグインがメモリを解放せずにリークしている
  • WP_MEMORY_LIMITはWordPressがmemory_limitを引き上げようとする値で、PHPの上限を超えることはできない
  • 画像の大量リサイズやインポート処理でGDライブラリがメモリを消費している

解決手順

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

// functions.php に一時的に追加してメモリ使用量を監視
add_action('shutdown', function(): void {
    if (! current_user_can('administrator')) return;
    $peak  = memory_get_peak_usage(true);
    $limit = ini_get('memory_limit');
    error_log(sprintf(
        'Memory peak: %s / limit: %s (%.1f%%)',
        size_format($peak),
        $limit,
        $peak / wp_convert_hr_to_bytes($limit) * 100
    ));
});
# 現在のメモリ設定を確認
wp eval "
echo '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 'Current usage: '     . size_format(memory_get_usage(true)) . PHP_EOL;
echo 'Peak usage: '        . size_format(memory_get_peak_usage(true)) . PHP_EOL;
"

# プラグイン別のメモリ消費を測定
wp eval "
\$before = memory_get_usage(true);
do_action('plugins_loaded');
echo 'plugins_loaded delta: ' . size_format(memory_get_usage(true) - \$before) . PHP_EOL;
"

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

; php.ini または .user.ini
memory_limit = 512M
# .htaccess(Apache + mod_php の場合)
php_value memory_limit 512M
// wp-config.php
define('WP_MEMORY_LIMIT',     '256M');  // フロントエンド用
define('WP_MAX_MEMORY_LIMIT', '512M');  // 管理画面用
# php.ini の場所を確認してから編集
php --ini | grep "Loaded Configuration"
# または
wp eval "echo php_ini_loaded_file();"

ステップ3:特定の処理でメモリを増加させる

// 重い処理の前に一時的にメモリ上限を引き上げる
function run_heavy_import(array $data): void {
    // WordPress の安全なメモリ引き上げ関数
    wp_raise_memory_limit('admin');  // WP_MAX_MEMORY_LIMIT まで引き上げ

    foreach ($data as $item) {
        // 処理
        process_item($item);

        // 大きなループではガベージコレクションを呼ぶ
        if (function_exists('gc_collect_cycles')) {
            gc_collect_cycles();
        }
    }
}

// raise_memory_limit フィルターで上限を制御
add_filter('wp_raise_memory_limit', function(string $filtered_limit, string $context): string {
    if ($context === 'admin') {
        return '512M';
    }
    return $filtered_limit;
}, 10, 2);

ステップ4:メモリリークを特定して解消する

// プラグイン別のメモリ消費を測定するデバッグコード
add_action('muplugins_loaded', function(): void {
    global $wp_memory_debug;
    $wp_memory_debug = [];
});

add_action('plugins_loaded', function(): void {
    global $wp_memory_debug;
    foreach (get_option('active_plugins', []) as $plugin) {
        $before = memory_get_usage(true);
        include_once WP_PLUGIN_DIR . '/' . $plugin;
        $wp_memory_debug[$plugin] = memory_get_usage(true) - $before;
    }
    arsort($wp_memory_debug);
    foreach (array_slice($wp_memory_debug, 0, 5, true) as $plugin => $bytes) {
        error_log(sprintf('Plugin memory: %s uses %s', $plugin, size_format($bytes)));
    }
}, 9999);

ステップ5:大量データ処理でメモリを節約する

// WP_Query の大量取得でメモリを節約する設定
$query = new WP_Query([
    'post_type'              => 'post',
    'posts_per_page'         => 100,
    'no_found_rows'          => true,   // SQL_CALC_FOUND_ROWS を省略
    'update_post_meta_cache' => false,  // postmeta キャッシュを無効化
    'update_post_term_cache' => false,  // term キャッシュを無効化
    'fields'                 => 'ids',  // IDのみ取得(WP_Post オブジェクトを作らない)
]);

// バッチ処理でメモリを分散させる
$offset = 0;
$batch  = 100;
do {
    $ids = get_posts(['fields' => 'ids', 'numberposts' => $batch, 'offset' => $offset]);
    foreach ($ids as $id) {
        process_post($id);
    }
    $offset += $batch;
    wp_cache_flush();  // キャッシュをクリアしてメモリを解放
} while (count($ids) === $batch);

注意事項

  • WP_MEMORY_LIMITはPHPのmemory_limitより大きな値を設定しても意味がありません。PHPの設定が上限です。共有ホスティングではmemory_limitを変更できない場合があります
  • memory_limit = -1(無制限)は開発環境のみで使用してください。本番環境では必ず上限を設定してください
  • メモリ不足が頻繁に発生する場合はプラグインの削減・軽量テーマへの変更・オブジェクトキャッシュの導入を検討してください

まとめ

PHPメモリ不足エラーの解決は①ini_get('memory_limit')memory_get_peak_usage()で現在の使用状況を確認・shutdownフックでピーク時のメモリ使用率をログ出力、②.user.iniまたは.htaccessmemory_limit=512Mに引き上げ・wp-config.phpWP_MEMORY_LIMIT=256MWP_MAX_MEMORY_LIMIT=512Mを設定、③wp_raise_memory_limit('admin')で重い処理前に上限を引き上げ・ループ内でgc_collect_cycles()でガベージコレクション・raise_memory_limitフィルターで上限値を制御、④プラグインごとのメモリ消費をログ出力して犯人を特定・メモリ消費の多いプラグインを無効化または代替品に変更、⑤WP_Queryno_found_rows=trueupdate_post_meta_cache=falsefields=idsを設定・バッチ処理とwp_cache_flush()でメモリを分散の手順で解決します。

お気軽にご相談ください

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