#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記法で書く記事なので、文章がだらだらーと書いていますが、読みづらくてすみませんでした。