【WordPress】wp-cronを止めてサイトのパフォーマンスを改善してみる

【WordPress】wp-cronを止めてサイトのパフォーマンスを改善してみる

wp-cronって?

WordPressを何もせずにデフォルトのままの設定にしていると、「wp-cron」という機能が自動的に設定されています。wp-cronはWordPressにアクセスがある度に毎回、その時間と予約投稿やバックアッププラグインなど登録されているタスクの時間を比較して実行します。「アクセスがあるたびに」というところがポイントで、サーバー側で定期実行しているわけでなく、アクセスされた時にプログラムを実行することで擬似的に予約投稿のような処理が可能になっているようです。

これはけっこう負荷が高いらしく、例えば予約投稿が20件あった場合、1アクセスのたびに20回wp-cron.phpにアクセスしてプログラムを実行してしまいます。また、プラグインを複数入れている場合も毎回更新チェックのためにプログラムが実行されますので、20個や30個入れていたらさらにプラスされます。

アクセスログでこれを見つけたとき、何か攻撃されているのかと思ってかなり焦りました。よくよく見ると、そもそもそのサイト自体からwp-cron.phpに複数アクセスがあることがわかり調べていくうちにwp-cronという機能が原因であることがわかりました。

予約投稿やバックアップのためにこんな負荷をかけたくないので停止しましょう!

wp-cronを停止する方法

wp-cronを停止するにはwp-config.phpに以下の記述を追記します。

define('DISABLE_WP_CRON', true);

追記する場所は1番上がわかりやすくて良いと思います。コメントアウトで「wp-cronの停止」とでも書いておけば忘れた頃に見ても思い出せると思います。

これでwp-cronが停止し、無駄なアクセスを抑えてパフォーマンスを向上することができます。

wp-cronを停止して出た効果

さくらレンタルサーバーのスタンダードプランで構築したWordPressサイトで、どのくらい効果が出るか検証しました。

実際の結果が以下です。

CPU使用時間

コントロールパネルのリソース情報から見れる9月末からの1ヶ月間のCPU使用時間です。9月末の山の頂点の25日にwp-cronを止めるとそこから一気に負荷が下がり、その後はずっと安定しています。9月末の山なりになっている時期はけっこう頻繁に503が出ていたのですが、それもなくなりサイトがちょっと軽くなったように思います。

弊社のクライアントで月間50万ほどアクセスのあるサイトでもこの対策を行ってみるとかなりの効果がありました。

サーバーでCRONを使う

予約投稿やXML-Sitemapやバックアップといったプラグインを使っている場合は完全に停止して機能しなくなるとちょっと困ります。
ただ、wp-cronでなくてもサーバーには通常CRONという定期実行できる機能があります。この機能を使ってwp-cron.phpに必要な時間だけアクセスしてあげれば最小の負荷で済みそうです。

今回はさくらインターネットのCRONを使う方法を紹介します。

1、さくらサーバーコントロールパネルにログイン

まずここからコントロールパネルにログインします。今回は新コントロールパネルで進めます。

2、CRON設定のページを開く

左側メニューの「スクリプト設定」から「CRON設定」のページを開きます。

さくらインターネットコントロールパネルCRON設定

3、スケジュールを追加する

「スケジュール追加」というボタンがあるのでクリックします。
CRON設定の登録画面が出てくるので、必要な項目を入力していきます。

実行コマンド

ここに定期実行させたい処理のコマンドを書きます。
具体的には以下です。

cd /home/[アカウント名]/www/[wp-cron.phpがあるフォルダ]; /usr/local/bin/php wp-cron.php 1> /dev/null
  • アカウント名:さくらインターネットで契約したアカウント名。
  • wp-cron.phpがあるフォルダ:公開ディレクトリ内にサブディレクトリを作って運用している場合はそのディレクトリに入ります。公開ディレクトリに直接WordPressをつっこんでいる場合は/home/[アカウント名]/wwwで良いです。

cd 〜って必要なの?って思いますが、詳しくはこちらのよくある質問に詳しく書いてありますのでご覧ください。CRONの実行にはユーザー権限が必要とのことです。

最後の1> /dev/nullは付けないとpostmasterにメールが送られるようです。必要ないので付けておきます。

コメント(説明)

このCRON処理についてコメントが付けられます。ここでは「[サイト名] wp-cronを毎時0分に実行」としておきます。コメントは書けるなら書いた方が良いと個人的には思います。

実行日時

実際に実行する日時をここで指定します。
今回は毎時0分に実行したいので以下のように設定します。

さくらインターネットCRONの実行日時設定

時間の設定の仕方は1, 2, 3の注釈通りですので、毎時10分おきに実行したい場合は分の所に*/10と書いたらOKです。

4、保存

さいごに「保存する」ボタンを押して完了です!

これでCRONがサーバー側で定期実行されるようになりました。wp-cronと違ってサイトに全く誰からのアクセスがなくても、時間が来たらサーバーが必ずwp-cron.phpにアクセスしてプログラムを実行してくれるので、WPに予約されているタスクを処理してくれます。

これでパフォーマンスを落とさずに予約投稿などもできるようになりました。

おわりに

今回はwp-cronを停止してパフォーマンスを改善する方法についてメモしました。実際にいくつかのサイトで効果が出ているので、今後もWordPresssサイトを作成する時には対策しておこうと思います。