Wordpress - cron ジョブを CLI に移動


しばらく前に、WordPress で構築された当社のサイトでパフォーマンスの問題が観察され始めました.私たちが確認した問題の 1 つは、ランダムなユーザー リクエストで cron を呼び出すことでした. URL https://yourdomain.com/wp-cron.php を呼び出すことで実現します.このファイルでは、WordPress は PHP メソッド fastcgi_finish_request を呼び出して、できるだけ早くユーザーに応答を送信しますが、メイン リクエスト中にサブ リクエストを呼び出すコストは、認識して改善する価値があります.これには他にも欠点があります.
  • リクエストコンテキストで cron を呼び出すことは、制限されていることを意味します. php-fpm の設定で. HTTP リクエストのリソース (メモリや制限時間など) が限られていることがよくあります.
  • さらに悪いことに、http 要求として cron を呼び出すと、リソース (トラフィックを処理するために必要な可能性がある php-fpm プールなど) が使用されます.

  • インターネット上には、cron を呼び出すサブリクエストの作成を無効にして CLI に移動する方法に関するヒントがたくさんあります.しかし、問題が 1 つあります.これらのヒントの多くは、crontab を使用して curl (または他の http 呼び出し) を呼び出して、これらのスケジュールされたタスクを呼び出すことを提案しています.これにより、最初の問題が解決され、ユーザー リクエストからサブリクエストがなくなりますが、上記の 2 つの問題は解決されません. WordPress には wp cron コマンドが付属しており、HTTP 呼び出しを行わずに CLI でスケジュールされたタスクの実行をサポートしているため、驚くべきことです.

    これを行うには、crontab に 1 行追加する必要があります.

    */5 * * * * wp cron event run --due-now --path=path_to_your_wp
    


    この場合、スケジュールされたタスクを 5 分ごとに呼び出します. WordPress は、実行する具体的なタスクを選択して実行する責任があります.

    もちろん、/wp-cron.php ファイルへのサブリクエストの呼び出しも無効にする必要があります.これを行うには、wp-config.php ファイルに以下を追加します.

    define('DISABLE_WP_CRON', true);
    


    私の意見では、wp-cron.php ファイルへのアクセスも拒否する必要があります (一部のボットは、このエンドポイントを要求してサイトに DDoS 攻撃を行う可能性があるため).アプリケーションサーバーレベルで作成することをお勧めします.たとえば、Nginx を使用する場合は、ホスト構成に次を追加します.

    location = /wp/wp-cron.php { deny all; }