Help us understand the problem. What is going on with this article?

WordPressでマルチサイトのWP-Cronの実行方法

More than 3 years have passed since last update.

1.シングルサイトでのwp-cronの場合には

WordPressで通常のシングルサイトによけるWP-Cronの実行の仕方は、たくさんあります。

簡単にあげれば
1.誰かが訪問時にWP-Cronが起動する方法
2.外部のインターネットサイトから●●●.com/wp-cron.phpを読みこんでもらう方法
3.内部のCRONTAB機能を使って、キックする方法

2.マルチサイトでの問題点

これらがマルチサイトになると、結構厳しいんですね。

上記の1.の誰かが訪問してくれるのをきっかけなんで、来てくれなかった場合の処理が実現できないという。

2.だとマルチサイト化するほど大きい規模となり、サーバー群は大きくなれるけど、1サーバーの場合には、
アクセスが一極集中すると、WP-CRONの実行結果が500(Internal Server Error)になりがちで、タイムアウトがおきてしまいます。

3.ということで、消去法ですが、内部のCRONTAB機能を使ってタイムアウトを起こさず、時間きっかりに起動する方法を考えました。

3.どんな実行方法?

Bash WP-Cliを用意します。Linux系ならWp-Cliをインストールします。(詳細は割愛)

以下のシェルを作って、定期的に実行です。

#!/bin/sh
WP_INSTALL_PATH="/var/www/vhosts/example.com/httpdocs"
for SITE_URL in $(/usr/local/bin/wp site list --fields=domain,path,archived,deleted --format=csv --path="$WP_INSTALL_PATH" | grep ",0,0$" | awk -F ',' '{print $1 $2}')
do
    echo "site:$SITE_URL ========"
    for EVENT_HOOK in $(/usr/local/bin/wp cron event list --format=csv --fields=hook,next_run_relative --url="$SITE_URL" --path="$WP_INSTALL_PATH" | grep now | awk -F ',' '{print $1}')
    do
        if [ $EVENT_HOOK != "do_pings" ]; then
            echo "event_hook:$EVENT_HOOK"
            echo `date +"%Y/%m/%d %H:%M:%S"` start
            echo "wp cron event run $EVENT_HOOK --url=$SITE_URL --path=$WP_INSTALL_PATH"
            /usr/local/bin/wp cron event run "$EVENT_HOOK" --url="$SITE_URL" --path="$WP_INSTALL_PATH" --no-color
            echo `date +"%Y/%m/%d %H:%M:%S"` end
        else
            echo "event_hook:$EVENT_HOOK"
            echo `date +"%Y/%m/%d %H:%M:%S"` start
            echo "wp cron event delete $EVENT_HOOK --url=$SITE_URL --path=$WP_INSTALL_PATH"                /usr/local/bin/wp cron event delete "$EVENT_HOOK" --url="$SITE_URL" --path="$WP_INSTALL_PATH" --no-color                echo `date +"%Y/%m/%d %H:%M:%S"` end
        fi
    done
done

WP-CLIを使って、CRONのEVENTを走らせます。
途中の文中にある"do_pings"は、うちのサーバーで溜まりやすいゴミを消去(delete)するスペシャルロジックを入れています。

検索で海外にあったFAQだったのを日本用に転用して書き直しました。
また、このCRONTABに登録するときは、以下の設定にしています。

0 4 * * * ( /bin/sh /var/www/vhosts/cron-●●●.sh > /var/log/cron-●●●.log 2>&1  ) ; ( cat /var/log/cron-●●●.log    | Mail -s "`hostname` GET wp-cron" メールアドレス )

4.最後に

今回、初めてmarkdown記法で書く記事なので、文章がだらだらーと書いていますが、読みづらくてすみませんでした。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした