WordPressのwp-cron.phpをサーバーのcronで実行する

WordPressでのタスクスケジュール実行機能

WordPressでは、予約投稿などを実現する為にアクセスがあった際にwp-cron.phpを実行して、予約時間を経過しているかチェックし経過している場合は記事を公開するといった仕組みを実装しています。いわば疑似cronというわけです。

誰もアクセスしなければ、いつまでも処理が実行されませんし、逆にアクセスの度にwp-cron.phpが実行されてしまう為、負荷も考慮しないといけません。

そこで、まず、wordpressでアクセスされる度に実行されるのを無効化し、サーバのcronで定期的に実行するようにします。

wordpress側でのwp-cron.phpの無効化

wpconfig.php に以下を追加します。

define('DISABLE_WP_CRON', true);

サーバ側でのwp-cron.phpのcron設定

/etc/crontab に以下のスケジュール実行を登録します。
*/10 で10分毎の実行。実行ユーザーは httpd としています。

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed
*/10  *  *  *  * httpd /bin/php -q /home/kusanagi/xxx/DocumentRoot/wp-cron.php > /dev/null 2>&1

実行ユーザーは環境により異なるかと思います。(httpd/apache/nignx等)
また、php の絶対パスは、サーバ上でwhich php などして確認してください。

ここで注意ですが、必ずWebサーバーのユーザーで実行します。そうでないとWebサーバーが書き込む際にパーミッションエラーになってしまう危険性があります。
root で crontab -e でcron設定などしないように注意してください。

 

2018/03/26追記 KUSANAGI環境での問題

KUSANAGI環境で、気付くと /var/log/cron に以下のようなエラーが出ていました。

(CRON) ERROR chdir failed (/home/httpd): No such file or directory

実行ユーザー httpd に関して /etc/passwd には以下のように記載されています。

httpd:x:1001:1001::/home/httpd:/bin/false

確かに /home/httpd というディレクトリは存在していません。このあたりはKUSANAGIのセットアップのままだったのですが・・・
以下のように、/home/httpd を作成して所有者・パーミッションを設定して、正常にCRONが動作するようになりました。


cd /home
sudo mkdir httpd
sudo chown httpd:www httpd
sudo chmod 750 httpd

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です