wp-cron の問題点
WordPress には定期的なイベントを実行する為に wp-cron という機能があります。記事の定時投稿や決まった期間毎の実行など、様々な機能で利用されています。
ところが、U*IX の cron とは異なり、wp-cron はウェブアクセスのあったタイミングで起動します。現在の私のサイトの様にアクセス数が少ない環境では実行頻度が下がり、逆にアクセス数の多いサイトでは wp-cron が頻繁に起動し負荷上昇の原因となります。
今回は、wp-cron のイベントを確認・追加する WP Crontrol プラグインをインストールして、どのようなイベントが登録されているのか、不要なイベントが登録されていないかを確認します。また、wp-cron を LOLIPOP! の cron 設定から起動するように変更し、将来アクセス数が増加した場合でも低負荷で運用できるように予め設定しておきたいと思います。
WP Crontrol プラグインのインストール
WP Crontrol enables you to view and control what’s happening in the WP-Cron system.
WP Crontrol を使用すると、WP-Cron システムで起こっていることを表示して制御できます。
https://wordpress.org/plugins/wp-crontrol/
WP Crontrol プラグインのインストールは他のプラグインと同様です。「今すぐインストール」-> 「有効」とする事で使用できるようになります。
有効にすると、
- ツールの中に「Cron イベント」
- 設定の中に「Cron スケジュール」
が追加されます。
Cron イベントを選択すると、現在登録されているイベントの一覧が表示されます。
「新規追加」ボタンを押すと、新しいイベントが作成できるようです。今は WordPress の wp-cron に追加したいイベントはありませんので、そういう機会があれば使ってみようと思います。
各イベントにカーソルを合わせると、「編集」、「今すぐ実行」、「Pause」、「削除」の四つのメニューが表示されます。「今すぐ実行」を選択すると、そのイベントがすぐに実行されます。
Cron スケジュールを選択すると「Cron スケジュール」が選択された状態で画面が開きます。
こちらでは新しいスケジュールを追加できるようです。こちらについても、使いたいような事項がありましたら試してみたいと思います。
ここまでで、WP Crontrol プラグインで wp-cron に登録されているイベントを確認、実行する事が出来るようになりました。
一時的にインストールしていた Jetpack の cron が残っていましたので削除しました。それ以外は WordPress の標準機能や Cocoon のアップデート、BackWPup、LiteSpeed cache に関するものでしたので、継続して使用します。
LOLIPOP! の cron で wp-cron を動作させる
wp-cron は初期の状態ではページにアクセスが無いと動作しませんので、LOLIPOP! レンタルサーバの cron を使用して wp-cron を定期的に実行するように変更します。
以下のページを参考に作業しました。
wp-cron.php を読み込むスクリプトの作成
LOLIPOP! レンタルサーバーの cron に登録する為の、wp-cron.php を読み込むスクリプトを作成します。
LOLIPOP! レンタルサーバーでは ~/web 以下にスクリプトを配置する必要があります。今回は、~/web/scripts ディレクトリを作成し、その中に update-wp-cron.sh を作成しました。chmod で実行権限 (700) を付けています。
$ mkdir ~/web/scripts
$ cd ~/web/scripts
$ cat update-wp-cron.sh
#!/bin/bash
/usr/bin/curl --no-progress-meter https://hiro20180901.com/wp-cron.php
echo "update wp-cron.php"
$ chmod 700 update-wp-cron.sh
$ ls -l
total 4
-rwx------ 1 username groupname 89 Mar 8 22:29 update-wp-cron.sh
$ ./update-wp-cron.sh
update wp-cron.php
実行してエラーが無い事を確認します。
- cron で実行される為、curl はフルパスで指定する必要があります。
- 動作確認の為に echo でメッセージを出力するようにしていますが、確認が終了したら echo を削除します。
- curl に --no-progress-meter オプションを付けます。オプションなしでは読込の進捗状況が表示されてメールが送られ続けます。エラー等が発生した場合にはメールが送られます。
LOLIPOP! レンタルサーバーの cron への登録
LOLIPOP! レンタルサーバーの管理画面の cron 設定に、作成したスクリプトを登録します。確認の為に5分毎に実行するように設定します。実行ファイルパスは、~/web/ 以下のパスを指定しますので、先頭には '/' (slash) は不要です。
「設定」を押すと登録されます。登録した後にメールアドレスを設定できるようになります。標準出力に何か出力した場合には、登録したメールアドレス宛にメールが届きます。今回は echo で標準出力に表示するように設定しましたので、正常に動作していれば5分毎にメールが届くはずです。
ちゃんと5分毎にメールが届いた事を確認したら、スクリプト内の echo の行を削除し、今度はメールが届かない事を確認します。
以上が確認できたら、cron の設定は終了です。5分毎に wp-cron.php が読み込まれて、wp-cron が動作するようになります。必要に応じて時間を調整して下さい。私は2分毎に設定しました。編集が出来ず、一度消して再登録しなければならない所は不便ですね。
ページ読み込み時の wp-cron を停止
LOLIPOP! レンタルサーバー内の cron を有効にした後で、ページ読み込み時の wp-cron を停止する設定を wp-config.php に追記します。DISABLE_WP_CRON の行を追加します。
...snip...
/** The database collate type. Don't change this if in doubt. */
define( 'DB_COLLATE', '' );
/** wp-cron停止 **/
define('DISABLE_WP_CRON', 'true');
...snip...
wp-cron が無効になると Cron イベントの画面に次のメッセージが表示されます。
DISABLE_WP_CRON 定数は true に設定されています。 WP-Cron の誘発が無効になります。
この状態でも、「次回実行」の日時が更新されていれば、LOLIPOP! レンタルサーバーの cron で wp-cron が実行されていますので問題ありません。
これで WordPress にアクセスした際に wp-cron が読み込まれなくなり、LOLIPOP! レンタルサーバーの cron のみで実行されるようになりました。
まとめ
WordPress の wp-cron の状態を調べる為に、WP Crontrol プラグインを導入しました。また、wp-cron を LOLIPOP! レンタルサーバー側の cron で実行する事により、WordPress へのアクセスとは無関係に一定時間毎に wp-cron が動作するようになりました。
現在は2分間隔で動作するように設定しました。一定時間毎に wp-cron を読み込む事をきっかけとして登録されているイベントが指定された時刻で起動するようになりますので、これまで発生していた BackWPup によるバックアップ時刻のズレは発生しなくなりました。
アクセス数が増加した際には、読み込み事に wp-cron が実行される事を防止して、サーバーの負荷を下げる事が出来ます。現在のアクセス数では心配ありませんが、今後の為に予め設定しておきます。
今回のアイキャッチ画像
森の中の小川を Stable Diffusion WebUI で生成しました。幼い頃に過ごした風景とよく似ています。
コメント