01
MAY
ウェブFRIDAY 2020 / 5 / 1
wp cron による定期実行の2回目以降が正常動作しない場合の対処法
Text by Hiroyuki Matsumoto
WordPressには wp cron という(疑似)定期実行システムがあるのですが、
登録した処理が1回目は正常に動作するものの、2回目以降は正常動作しないケースがありました。
なお、この際に定期実行される処理は
・HTMLキャッシュ再生成のために、file_get_contentsで自サイトにアクセス
・1~3秒ほどかかり少々負荷が高い
ものでした。
正常に動作しなかった際の書き方
add_action('my_hook_name', 'my_function_name'); if(! wp_next_scheduled('my_hook_name')){ wp_schedule_event(time(), 'everyfiveminute', 'my_hook_name'); } function my_function_name(){ // イベント処理 }
結果として、下記のように time() + 10 として初回実行を 登録直後 にするのではなく、登録から10秒後に実行する、というようにしたところ正常に動作するようになりました。
add_action('my_hook_name', 'my_function_name'); if(! wp_next_scheduled('my_hook_name')){ wp_schedule_event(time() + 10, 'everyfiveminute', 'my_hook_name'); } function my_function_name(){ // イベント処理 }
おそらく、
1. アクセス (A) が発生
2. (A) wp cron にイベント登録
3. 2のイベントを即時実行
4. アクセス (B) が発生
5. (B) wp cron にイベント登録
のように、想定外のタイミングで同様の処理が発生して無限ループに近い症状が起きているのではないかなと思われます。
なお、wp cron の動作状況の確認には WP Crontrol が便利です。
・実行まであとどのくらいか?
・イベントの即時実行
・イベントの削除
等が簡単に確認/操作できデバッグしやすいです。
TEXT by
松本 博之(まつもとひろゆき)
1978年、鳥取県米子市生まれ。
株式会社マジックワード WEBシステムの開発・運用を担当。
WordPressの実績多数。表面的な使用方法を把握するだけでなく、WordPressのソースコードを読み解いて対応できます。
国家資格の応用情報処理技術者をなんとなくとりました。