2026年8月8日
2026年8月8日
WordPressのメモリ不足エラーを解決する方法
はじめに
WordPressで「Fatal error: Allowed memory size of 134217728 bytes exhausted」エラーが出て画面が白くなる・特定のページや操作でメモリ不足エラーになる・メモリを増やしてもすぐに足りなくなるといった問題の解決方法を解説します。
症状・原因
WP_MEMORY_LIMITの設定がPHPのmemory_limitを超えて設定できない- メモリリークのあるプラグインが繰り返し使用するたびにメモリを消費している
- 大きな画像のアップロード・リサイズ時にGDライブラリがメモリを大量消費している
- WP-CLIや長時間バッチ処理でメモリが徐々に増加してOOMエラーが発生している
解決手順
ステップ1:メモリ使用量を確認する
# ✅ 現在のメモリ設定を確認
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: ' . size_format(memory_get_usage(true)) . PHP_EOL;
echo 'Peak usage: ' . size_format(memory_get_peak_usage(true)) . PHP_EOL;
" --path=/var/www/html/
# → WP_MEMORY_LIMIT: 256M
# → PHP memory_limit: 128M ← PHPの制限がWPより低い(問題)
# → Current usage: 67 MB
# → Peak usage: 124 MB
# ✅ PHPのメモリ設定を確認
php -i | grep "memory_limit"
# → memory_limit => 128M => 128M
# ✅ php.ini のパスを確認
php --ini | head -5
# → Configuration File (php.ini) Path: /etc/php/8.2/cli
# → Loaded Configuration File: /etc/php/8.2/cli/php.ini
php -i | grep "php.ini"
# FPM 用の設定ファイル
# → /etc/php/8.2/fpm/php.ini
ステップ2:メモリ制限を増加する
# ✅ wp-config.php でWordPressのメモリ制限を設定
wp config set WP_MEMORY_LIMIT '256M' --path=/var/www/html/
wp config set WP_MAX_MEMORY_LIMIT '512M' --path=/var/www/html/
# WP_MEMORY_LIMIT: 通常の処理
# WP_MAX_MEMORY_LIMIT: 管理画面・バックグラウンドタスク
# ✅ PHP-FPM の php.ini を編集
sudo sed -i 's/^memory_limit = .*/memory_limit = 512M/' /etc/php/8.2/fpm/php.ini
# ✅ Apache + mod_php の場合
sudo sed -i 's/^memory_limit = .*/memory_limit = 512M/' /etc/php/8.2/apache2/php.ini
# ✅ .htaccess で設定(共有ホスティング向け)
cat >> /var/www/html/.htaccess << 'EOF'
php_value memory_limit 512M
EOF
# ✅ 変更を反映
sudo systemctl reload php8.2-fpm
sudo systemctl reload nginx
# ✅ 反映確認
wp eval "echo ini_get('memory_limit');" --path=/var/www/html/
# → 512M
# ✅ メモリ設定が変更できない場合(user.ini)
echo "memory_limit = 512M" | sudo tee /var/www/html/.user.ini
sudo chown www-data:www-data /var/www/html/.user.ini
ステップ3:メモリリークを特定する
# ✅ プラグイン別のメモリ使用量を計測
wp eval "
\$before = memory_get_usage();
// プラグインA のみ有効にして計測
\$after = memory_get_usage();
echo 'Plugin memory: ' . size_format(\$after - \$before) . PHP_EOL;
" --path=/var/www/html/
# ✅ 全プラグインを無効化してメモリ使用量を確認
wp plugin deactivate --all --path=/var/www/html/
wp eval "echo 'Memory without plugins: ' . size_format(memory_get_usage()) . PHP_EOL;" \
--path=/var/www/html/
# ✅ プラグインを1つずつ有効化してメモリリークを特定
for plugin in $(wp plugin list --format=ids --status=inactive --path=/var/www/html/); do
wp plugin activate $plugin --path=/var/www/html/ 2>/dev/null
MEM=$(wp eval "echo memory_get_peak_usage(true);" --path=/var/www/html/ 2>/dev/null)
echo "$plugin: ${MEM} bytes"
done
# ✅ WP-CLI バッチ処理のメモリリーク対策
wp eval "
// 大量データ処理時のメモリ節約
\$offset = 0;
\$batch_size = 100;
while (true) {
\$posts = get_posts([
'numberposts' => \$batch_size,
'offset' => \$offset,
'post_type' => 'product',
]);
if (empty(\$posts)) break;
foreach (\$posts as \$post) {
// 処理...
// オブジェクトキャッシュをクリア(メモリ節約)
wp_cache_flush();
}
\$offset += \$batch_size;
echo 'Processed: ' . \$offset . ', Memory: ' . size_format(memory_get_usage()) . PHP_EOL;
}
" --path=/var/www/html/
ステップ4:画像処理のメモリ使用量を最適化する
# ✅ 画像リサイズのメモリ要件を計算
# 必要メモリ = 幅 × 高さ × ビット深度 × チャンネル数 × 係数
# 例: 4000×3000px JPEG = 4000 × 3000 × 8 × 4 × 1.5 = 576MB
# ✅ アップロード最大サイズを確認
wp eval "echo 'Upload max: ' . wp_max_upload_size() / 1024 / 1024 . 'MB';" \
--path=/var/www/html/
# ✅ 大きな画像のサムネイル生成を最適化(functions.php)
// ✅ 不要なサムネイルサイズを削除(メモリ節約)
add_action('init', function() {
remove_image_size('medium_large');
// WooCommerce サムネイルサイズのカスタマイズ
});
// ✅ Imagick を使用(GDより効率的)
add_filter('wp_image_editors', function($editors) {
return ['WP_Image_Editor_Imagick', 'WP_Image_Editor_GD'];
});
// ✅ 大きな画像の自動スケールダウン設定
// WordPress 5.3+ で 2560px 以下にスケールダウン
add_filter('big_image_size_threshold', function() {
return 1920; // アップロード時に1920px以下にスケールダウン
});
# ✅ GD の利用可能メモリを確認
php -r "
\$info = gd_info();
echo 'GD Version: ' . \$info['GD Version'] . PHP_EOL;
echo 'JPEG Support: ' . (\$info['JPEG Support'] ? 'Yes' : 'No') . PHP_EOL;
"
ステップ5:VPS・専用サーバーでのメモリ最適化
# ✅ システム全体のメモリ使用量を確認
free -h
# → total used free shared buff/cache available
# → 2.0G 1.8G 50M 100M 150M 100M ← ほぼ枯渇
# ✅ PHP-FPM のプロセス設定を最適化
sudo nano /etc/php/8.2/fpm/pool.d/www.conf
# pm = dynamic
# pm.max_children = 5 ← (総RAM - システム使用) / PHP1プロセスのメモリ
# pm.start_servers = 2
# pm.min_spare_servers = 1
# pm.max_spare_servers = 3
# ✅ PHP-FPM のメモリリクエスト上限
# pm.max_requests = 500 ← X リクエスト後にワーカーを再起動(メモリリーク対策)
sudo grep -n "pm.max_requests" /etc/php/8.2/fpm/pool.d/www.conf
sudo sed -i 's/;pm.max_requests = .*/pm.max_requests = 500/' /etc/php/8.2/fpm/pool.d/www.conf
# ✅ OOMキラーのスコアを調整(Nginxが先に終了されないように)
echo -1000 | sudo tee /proc/$(pgrep -x nginx | head -1)/oom_score_adj
echo 500 | sudo tee /proc/$(pgrep php-fpm | head -1)/oom_score_adj
# ✅ PHP-FPM 再起動
sudo systemctl restart php8.2-fpm
注意事項
- メモリ制限を闇雲に増やすだけでは根本的な解決になりません。
memory_get_peak_usage()でどの処理が大量のメモリを消費しているか特定してからプラグインの見直しやコードの最適化を行ってください - PHP-FPMの
pm.max_childrenはサーバーの物理RAMを超えて設定しないでください。例えば2GBのRAMでシステム使用量が500MB、1プロセスあたり100MBならmax_children = 15程度が上限です
まとめ
WordPressメモリ不足の解決は①ini_get('memory_limit')とWP_MEMORY_LIMITの不一致を確認・memory_get_peak_usage()でピーク使用量を計測、②php.iniのmemory_limitを512Mに変更・wp-config.phpにWP_MEMORY_LIMIT = 256M・WP_MAX_MEMORY_LIMIT = 512Mを設定・PHP-FPMを再起動、③プラグインを1つずつ有効化してメモリリーク犯人を特定・バッチ処理ではwp_cache_flush()でキャッシュクリア、④big_image_size_thresholdフィルターで画像の最大サイズを制限・Imagickを優先使用・不要なサムネイルサイズを削除、⑤PHP-FPMのpm.max_childrenを物理RAMに合わせて調整・pm.max_requests = 500でメモリリーク対策の手順で最適化します。