動かないwp-cronを動かすのに苦労した話

1年以上前に更新された記事です。
情報が古い可能性がありますので、注意してください。

SNS Count Cacheが動かない

事の発端はSNS Count Cacheが動かなかったに始まる。クローラーがwp-cronで動いているはずなんだけど、待てど暮せど動かない。
アクセス数一桁だけど、私自身が管理画面にアクセスするので、全く動かないのはおかしい。

動かない原因を色々調べて、動作させた話。

プラグインが原因?

プラグインのエラーで動いてない疑惑

phpモジュールが足りない

SNS Count Cacheはphp-curlを使用している。
php7に更新した際、インストールし忘れていたようで入っていなかったのでインストールした。

WebAPIに不具合

Twitterツイート数取得API「count.json」のサービス提供が終わっているので、そのままだとツイート数取得出来ない。ここは、代替サービスであるwidgetoon.js と count.jsoonに登録して、プラグインも修正。

この変更で「部分キャッシュ」となっていた所が「完全キャッシュ」になった。
でも、肝心のwp-cronは動いてくれなかった。

WordPressが原因?

wp-cronの状況

WP-Cron Dashboardをインストールして、wp-cronの状況を見てみる。

wp-cron予約一覧

何じゃこりゃ!!
ずーっと動いてないじゃん。
こいつらが動き出しても困るし、削除したプラグインのものも含まれてるので、ここ3日分くらい残して古いものは削除。

SQL叩いてバッサリ消したかったけど、チキンな私は削除ボタンポチポチ押した。
ボタンポチポチしてる間にもちょっと増えるcron…

wp-cron動いてない疑惑

余りにも動いてないので、wp-cron自体動いてないのでは?と思ったけど、WordPressのバージョンチェックが動いているので、全く動いていないというのはなさそう。

nginxがキャッシュして動かない疑惑

コマンドラインから実行させたけど、やっぱり動かない。
エラーも出ない。
ノーリアクション。

ベーシック認証使ってる疑惑

そんなん使ってないわっ!

キャッシュ系のプラグインの使用している疑惑

以前、試しに使ってみたことはあるけど、今現在使っていない。
関係ないかなと思ったけど…

WordPress予約投稿に失敗する原因はwp-content/object-cache.phpだった
こんな記事を見つけた。
キャッシュ系のゴミが残っていても動かないとのこと。

wp-contentを見てみるとcacheディレクトリはあるけど…
wp-content/cache/amazonjs
wp-content/cache/autoptimize
関係なさそうな二つ。

試しにディレクトリ消して、プラグイン無効にしたけど、やっぱりダメ。

wp-cronの使用を明示

最終手段。
と言うより、最初にやってみてね。と、言った感じ。
コンセントは刺さってますか的なアレ。

どっこに書こうかなと、wp-config.phpを見ていると…
ゴミが残ってましたよ。ゴミが!

サクッと削除して、ついでに下記を追加してwp-cronの使用を明示。

そして、適当なページにアクセス!




い、wp-cron

不思議な力で動けない疑惑

やはり、動かないことで悩んでいる人はいっぱいいるようで、コードまで読んでしまった人もいるようですね。凄いというか何というか…

wp-cron.phpではどのようなことが行われているか?

では、wp-cron.phpの動作を見てみたいと思います。

まず、処理の流れとしては、以下の様な順序で行われています。

初期設定
設定されているCRONジョブの取得
CRONジョブが別なCRONジョブによって既にロックされているかどうかのチェック
CRONジョブの実際の処理
CRONジョブのロックの解除
このように、流れとしては特に難しいものではありませんでした。

WordPressで予約投稿失敗の原因究明のため、wp-cron.phpを読んでみました | sand a lot Web & Music Create [札幌] より

これはロックされている可能性が高い。
しかし、どうやって解除したものか…

そうだ!
nginxとphp-fpm再起動してみよう。

再起動して適当なページにアクセスすると、何だかサーバーが考えてる空気。
やった!動いた!!
そして、タイムアウト

いやいや、タイムアウトはイカンでしょ。
でも、溜まっていたものが動いたからこそのタイムアウト。
リロードしたら、ページは表示されたので問題無し。

その後もちょいちょい覗いてみると、ちゃんと動いてる。ただ、cronが動く場合のURLが長いパラメータ付きになってしまうのが難点。

最後に

wp-cronが動かない時の対処法は、以下の通りです。

  • プラグイン自体のエラーを潰す
  • コンフィグにwp-cronの使用を明示する。
  • キャッシュ系プラグインを停止
  • キャッシュ系プラグインの残骸を探し回って削除
  • サービス再起動

表示速度上げるのに、安易にキャッシュ系プラグインに手を出すなってことですね。他のプラグインとの相性が最悪すぎる。

最後に最後に

今回は、サービスの再起動で動くようになったけど、アクセス時にwp-cronが動くと、表示に時間がかかってしまう(最悪タイムアウト)。
なので、OS側のcronで実行させた方が、見る人にとっては優しいと思う。

linuxのcronでwp-cron.phpを実行する

最近のレンタルサーバーなら、管理コンソールから同様の設定ができるはずです。

コメントを残す

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