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での診断で解決します。