2019年9月16日(月) 07:02 JST

CUSTOM_runSheduledTask()にご注意

  • 投稿者:
  • 表示回数 3,323
Geeklog Geeklogには定期的な作業を行うスクリプトを自動的に呼び出してくれる CUSTOM_runSheduledTask() という関数が lib-custom.php で定義されている。Unixなら cron,Windowsならタスクスケジューラに相当する機能で,実施される時間はさほど正確ではないが,24時間インターバルくらいの作業なら十分使える。 昨晩,データベースをバックアップするプラグイン(Dbman)をこの関数から呼び出して,毎日,らくらくバックアップを取ろうと目論んだら,エライ目にあった。この関数は lib-common.php の一番最後の部分から呼び出される。


// Check and see if any plugins (or custom functions)
// have scheduled tasks to perform
if(( DB_getItem( $_TABLES['vars'], 'value', "name='last_scheduled_run'" )
+ $_CONF['cron_schedule_interval'] )


最初にテーブル(gl_vars)に書き込まれている last_scheduled_run という値をチェックし,それから所定の時間が経っていたら,PLG_runScheduledTask() を呼び出し, last_scheduled_run を更新するという動作なので,間違えようもない。

ところが last_scheduled_run がインストール時にテーブルに設定されるのは 1.4.0 を新規インストールしたときだけなので,それ以前のバージョンからアップしたサイトでは,この if 文が常に成り立ってしまい,lib-common.php が呼び出される度に CUSTOM_runSheduledTask() が実行されるという恐ろしい結果になってしまった。本家の掲示板で訊いてみると,Dirkさんから「それ,バグやねん。CUSTOM_runSheduledTask()は 1.4.1 で名前が変わるから,気ぃつけといてや」というレスが返ってきた。解決策は簡単で,CUSTOM_runSheduledTask()を使用する前に, last_scheduled_run にゼロをセットしておけば,すぐに正しい値で上書きされ,以降は config.php の $_CONF['cron_schedule_interval'] で指定した時間間隔で実行されるようになる。