見出し画像

AWS x WordPress Vol.1 〜phpのメモリ上限エラーの時の対処法〜

🔍どんな問題が起こるのか?

極論ですけど、WordPress使うならAWSを避けるorAWS使いたいならWord Press避けた方がいいんじゃない?Webディレクターです!

今回はAWSxWordPressで発生した問題について、記録として残しておきます。

WordPress の管理画面で、「公開済みのニュース記事の中からトップページに表示する記事を選択する」ために プルダウンメニューを作成 した。しかし、記事数が増えると、エラーが発生してプルダウンにデータが表示されなくなるという問題が発生。

なぜエラーが起こるのか?

1️⃣ PHP のメモリ上限(memory_limit)を超えてしまう

  • WordPress は PHP というプログラム で動いている。

  • PHP には 「1回の処理で使えるメモリの上限」 が決まっている
    (例:128MB)

  • 記事の数が増えてくると、すべてのデータを一気に処理しようとして メモリの上限を超えてエラー になる。

2️⃣ 処理時間(max_execution_time)を超えてしまう

  • WordPress の管理画面が記事データを読み込むのに時間がかかりすぎると、途中で処理が強制終了 する。

  • これが「タイムアウトエラー」の原因。

3️⃣ プルダウンメニューが一度にすべての記事を読み込もうとする

  • ニュース記事が 1000件 あると、プルダウンに 1000個の選択肢を一気に追加 しようとする。

  • すると、ページの読み込みが遅くなり、最悪の場合 画面がフリーズ する。


✅ 解決策

この問題を解決するには、以下の方法を組み合わせて対策するのがベスト。


方法 1️⃣: PHP のメモリ上限を増やす

一時的な解決策 として、PHP のメモリ上限を増やすことでエラーを防ぐ。

設定方法

(1)WordPress の wp-config.php を変更

define('WP_MEMORY_LIMIT', '256M'); // メモリ上限を256MBに増やす


(2)サーバーの php.ini を変更

memory_limit = 256M
max_execution_time = 300  ; 実行時間を300秒に延長


📌 ただし、これは一時的な対応であり、根本的な解決にはならない。


方法 2️⃣: プルダウンの仕様を変更する(最初から全部を読み込まない)

❌ NG: 全記事を一気に読み込む

<select>
  <option>ニュース記事 1</option>
  <option>ニュース記事 2</option>
  <option>ニュース記事 3</option>
  ...(1000件続く)
</select>
  • 記事数が増えるほど、ページが重くなる

  • サーバーがメモリを消費しすぎてエラーになる

  • ユーザーにとっても、選択肢が多すぎて使いにくい

✅ OK: 最新50件のみ表示 & 「もっと見る」ボタンを設置

<select id="news-select">
  <option value="">選択してください</option>
</select>
<button id="load-more">もっと表示する</button>
  • 最初は 最新50件 だけを表示。

  • 「もっと表示する」ボタンを押したときに追加でデータを取得 する。

  • こうすることで、一度に大量のデータを読み込まず、サーバーの負荷を抑える。


方法 3️⃣: AJAX を使って、必要なときだけデータを取得する

フロントエンド(JavaScript)

jQuery(document).ready(function($) {
    $('#news-select').on('focus', function() { // プルダウンを開いたらデータを取得
        if ($(this).children('option').length === 1) { // すでにデータがある場合は取得しない
            $.ajax({
                url: ajaxurl,
                type: 'POST',
                data: {
                    action: 'get_news_list'
                },
                beforeSend: function() {
                    $('#news-select').append('<option>読み込み中...</option>');
                },
                success: function(response) {
                    $('#news-select').empty();
                    $('#news-select').append(response);
                },
                error: function() {
                    alert('データの取得に失敗しました');
                }
            });
        }
    });
});

📌 ポイント

  • プルダウンを開いたときだけデータを取得

  • 一度取得したら、再度開いたときにリクエストを送らない(無駄な通信を防ぐ)


WordPress 側(functions.php)

function get_news_list() {
    if (!is_user_logged_in()) {
        wp_die('権限がありません');
    }

    $args = array(
        'post_type'      => 'news',
        'posts_per_page' => 50,
        'orderby'        => 'date',
        'order'          => 'DESC'
    );

    $query = new WP_Query($args);

    if ($query->have_posts()) {
        while ($query->have_posts()) {
            $query->the_post();
            echo '<option value="' . get_the_ID() . '">' . get_the_title() . '</option>';
        }
    } else {
        echo '<option>記事がありません</option>';
    }

    wp_reset_postdata();
    wp_die();
}
add_action('wp_ajax_get_news_list', 'get_news_list');
add_action('wp_ajax_nopriv_get_news_list', 'get_news_list');

🔍 まとめ

PHP のメモリ上限を増やす(ただし一時的な対応)
プルダウンに最初からすべてのデータを入れない(50件ずつ表示 & もっと見るボタン)
AJAX を使って「プルダウンを開いたときにデータを取得」することでサーバー負荷を軽減

💡 この方法を組み合わせれば、サーバーの負荷を減らしつつ、快適な WordPress 管理画面が実現できます! 🚀

いいなと思ったら応援しよう!