cronジョブは、WordPressサイトで定期的に決まった時間、日付、間隔でタスクを実行するのに使用されます。WordPressのcronジョブの例としては、投稿の公開、更新のチェック、バックアッププラグインのスケジュール設定などがあります。
WordPressでは通常、このような処理に、システムcronをシミュレートしたWP-Cronを使用します。便利な機能ではありますが、サイトへのトラフィック量によっては、組み込みのcronハンドラを使用するとページの表示時間に悪影響が出てしまう可能性があります。そこで今回は、WP-Cron(wp-cron.php
)を無効にし代わりにシステムcronを使用する方法をご紹介します。
WP-Cronのパフォーマンスの問題
Kinstaではリソース負荷の激しい高PVサイトを数多くホスティングしています。WordPressのビルトインCronハンドラであるWP-Cronにより引き起こされるパフォーマンスの問題を目にしてきました。まず第一に、WP-Cronはcronジョブそのものではなく、WordPressがシステムcronを模倣し作成したものであることを理解することが重要です。
WP-Cronは継続的に実行されません。デフォルトでは、wp-cron.php
はページが読み込まれる度に実行されますが、これはトラフィックの多いサイトでは問題を引き起こす可能性があります。サイトに十分なワーカープロセスがないと、リクエストが発生した際に、WordPressでcronが起動しても、何も行動は行わずワーカープロセスを待つだけになることがあります。
逆のパターンもあり得ます。サイトのトラフィックが十分にないと、誰もページを読み込まないためにスケジュール設定した処理が実行されない可能性があります。
これらへの対策として、WP-Cronを無効にし、代わりにシステムcronを使用することができます。そうすることで、スケジュール通りに操作を実行可能です。公式プラグインハンドブックでも推奨されています。
WP-Cronを無効にする方法
WP-Cronを無効にするには、wp-config.php
を「That’s all, stop editing! Happy blogging.」という行の直前に以下を追加してください。注)これにより、wp-cron.php
を介して直接呼び出した時ではなく、ページ読み込み時に実行される機能が無効になります。
define('DISABLE_WP_CRON', true);
システムcronのスケジュール設定方法
続いてサーバーからwp-cron.php
の処理を設定します。
マルチサイトである場合、サブサイトに対してcronジョブを実行するために、追加のセットアップ手順が必要になります。以下に関連記事をご紹介します。
シングルサイト(非マルチサイト)のWordPressサイトをお持ちであれば、Kinstaでの特別な設定は不要です。Kinstaのサーバーサイドcronはデフォルトで15分ごとにwp-cron.php
を実行する仕様です💪 これにより、スケジュールに従ってWordPress cronが実行されます。バックエンドで頻度を増やすこともできますので、必要であればカスタマーサポートまでご連絡ください。
SSH接続の操作に慣れている方は、Kinstaでコマンドラインを使ってサーバーのcronを管理する方法もご覧ください。KinstaのすべてのホスティングプランにSSHアクセスが含まれています。
Kinstaをお使いでない場合には、システムcronの設定方法についてWordPress Cronジョブを設定する方法(英語)が参考になるかもしれません。
cPanelでcronジョブを作成する方法
cPanel採用のサーバーをご使用中であれば、コントロールパネルからシステムcronを作成することもできます。注意)まず、上記のデフォルトのWP-Cronを無効にしてください。
ステップ1
cPanelにログインします。「Advanced」セクションで「Cron Jobs」をクリックします。
ステップ2
「Add New Cron Job」セクションで、1時間に2回や1週間に1回など、特定のスケジュールの中から選択することができます。ホスティングサービスごとにcronジョブの実行頻度が制限されていることがあります。共用サーバーでは1時間に2回が一般的な設定です。
ステップ3
以下のコマンドを追加します。https://domain.com
の部分を実際のドメイン名に置き換えてください。このコマンドはホスティングの設定方法によって若干異なる可能性があります。そして「Add New Cron Job」をクリックします。
wget -q -O - https://domain.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1
上記のコマンドの>/dev/null 2>&1
の部分はメールの通知を無効にするものです。
サードパーティサービスでcronを設定する
サーバーでのcronジョブの設定に抵抗がある、ホスティングサービスでのアクセスが不可能である場合には、EasyCronのようなサードパーティソリューションを使用することもできます。