WP CrontrolとSQLite

この記事は約3分で読めます。

「WP Crontrol」プラグインは、WordPressに備わっているcronを管理するソフトだ。
WordPressは自動投稿や定期的な自動処理を行うことができる。
手動で実行したり時間間隔などを変更する機能は標準でありそうだけど、変更したければ直接ソースを修正するらしい。
ソースを直接修正しなくても変更ができるのが、このプラグインである。

現在のところプラグインが出力するエラーログは消えたものの、WordPress本体からと思われるエラーログは定期的に出続けている。
具体的にはwp-cron.phpが呼び出されると

DELETE a, b FROM wp_options a, wp_options b
WHERE a.option_name LIKE ‘_transient_%’
AND a.option_name NOT LIKE ‘_transient_timeout_%’
AND b.option_name = CONCAT( ‘_transient_timeout_’, SUBSTRING( a.option_name, 12 ) )
AND b.option_value < [良くわからない数字]

というエラーを出すのだ。
修正を試みたいが、本体となると失敗のダメージがでかすぎる。
海外でSQLiteを使うとこのエラーがでるとのコメントは見つけたが、解決方法までは分からなかった。

このエラーで気になるのが、DELETE a, b FROM~というところだ。
自分は今まで、DELETE FROM~と書く方法しか知らなかった。a, bとはなんぞや?という感じでDELETEの条件が良くわからない。
[良くわからない数字]はtimeoutとなっているから、エポック秒かなんかの時間だろう。
直接SQLiteに対して、このDELETE文を実行すると「near “a”: syntax error」とかでるから、この書き方そのものがMySQLの方言な気がする。
削除対象は、おそらくSELECT * FROM wp_options a, wp_options b WHERE~で表示されるデータだとは思うのだけど。。。
こちらは長いことかけて勉強と調査が必要だ。
一応ゴミデータを消しているだけのようなので、ほっといても遅くなる以外は問題はなさそうである。

ただこのエラーが気持ち悪いのでcronでの自動実行を止めてエラーを消したいのだ。そのために「WP Crontrol」プラグインを導入してみた。
例のごとくエラーが出ないかいろいろ調査してみたが特に問題はなかった。ソースを見た限りデータベースへは直接見に行かないようである。実際にこのプラグインに対するApacheのエラーログは出ていない。
SQLiteでも使用に特段問題は無い。安心安全のプラグインだ。

これを導入して驚いたのだが、自動実行されるプログラムがなかなか多い。ひとつひとつ理解するのは、なかなか大変そうである。
直接WordPress本体のプログラムを調査すると、/wp-includes/option.phpにdelete_expired_transientsという関数があった。これが呼び出されているらしい。
よく見るとApacheのエラーログにdelete_expired_transients()の記載があったので、これで間違いないだろう。
とりあえず「WP Crontrol」の「Cron イベント」にある「delete_expired_transients()」について「このフックを一時停止」にしてみた。これでひとまずエラーは消えるはずだ。しばらく様子を見てみる。

実際のデータ削除については、後日ゆっくり調査することにしよう。
これでWordPress初心者から初級位にはなったかな?

コメント