Appearance
保守クリーンアップバッチ
目的
WordPress の運用中に増え続ける一時データやログを、WP-Cron で定期的に掃除する。対象は期限切れ transient、期限切れの同時実行ロック行、debug.log。
対象バッチ
| バッチ | Cron hook | 実行頻度 | schedule sync | 主な処理 |
|---|---|---|---|---|
| 期限切れ transient クリーンアップ | slot_kouryaku_daily_transient_cleanup | daily | admin_init | delete_expired_transients(true) を実行する |
| 期限切れロック行クリーンアップ | slot_kouryaku_daily_option_row_lock_cleanup | daily | admin_init | OptionRowLockInterface::purge_expired() で期限切れのロック行を消す |
| debug.log ローテーション | slot_kouryaku_daily_debug_log_rotation | daily | init priority 20 | 期限切れローテーション済みログを削除し、肥大化した debug.log をローテーションする |
いずれも schedule sync を transient で 1 日 1 回までに間引く。
期限切れ transient クリーンアップ
TransientCleanupScheduler が daily cron を登録し、実行時に delete_expired_transients(true) を呼び出す。外部オブジェクトキャッシュが有効な場合でも、options テーブル側に残った期限切れ transient を掃除対象にするため、強制フラグ true を渡す。
多重実行対策
| 項目 | 内容 |
|---|---|
| ロック | slot_kouryaku_transient_cleanup_lock option |
| 取得方法 | add_option() の UNIQUE 制約を使って原子的に取得する |
| TTL | 1時間 |
| stale 対応 | 不正値または TTL 超過のロックは削除して再取得を試す |
期限切れロック行クリーンアップ
OptionRowLockCleanupScheduler が daily cron を登録し、実行時にコンテナから OptionRowLockInterface を取得して purge_expired() を呼び出す。日別データ取込(API-005、ADM-011 / ADM-020)の同時実行ロックは、通常は取込の終了時に消えるが、致命的エラーや実行時間超過で解放されなかった行は同じ日付・ホールを取り込まない限り残る。
| 項目 | 内容 |
|---|---|
| 対象行 | wp_options の _option_row_lock_%(改名前の _bot_rest_lock_% も含む) |
| 期限切れ | 値「トークン|期限(Unix 秒)」の期限が現在時刻以前、または期限を読めない行 |
| 削除条件 | 読んだ option_value と一致する場合だけ消す(読んだあとに別リクエストが取り直したロックは消さない) |
| 1 回の上限 | 読む行数は 500 行まで(有効なロックも数に含む) |
| DB エラー | 何も消さず、error_log に [option-row-lock] purge failed: db error を 1 行書く |
| 多重実行 | ロックしない。同時に走っても値一致の削除なので、有効なロックを消したり二重に消したりしない |
debug.log ローテーション
DebugLogRotationScheduler が daily cron を登録し、DebugLogServiceInterface::resolve_log_path() で対象ログを解決してから処理する。
| 項目 | 内容 |
|---|---|
| ローテーション閾値 | 100MB 超過(DebugLogMaintenanceConstants::MAX_LOG_BYTES) |
| 保持期間 | ローテーション済み debug.log.N を 14 日保持(mtime 基準) |
| ロック | DebugLogRotationLock |
DebugLogRotator::purge_expired_rotated_files()で期限切れのローテーション済みログを削除する。DebugLogRotationLock::try_acquire()でロックを取る。DebugLogRotator::rotate_if_oversized()で閾値超過時のみdebug.logをローテーションする。- ローテーションが発生した場合は
error_logに結果を記録する。
障害再発防止の運用背景は サイト障害再発防止 を参照する。
参照ファイル
core_src/Admin/transient_cleanup/TransientCleanupScheduler.phpcore_src/Admin/option_row_lock_cleanup/OptionRowLockCleanupScheduler.phpcore_src/Infrastructure/word_press/WordPressOptionRowLock.phpcore_src/Admin/debug_log/DebugLogRotationScheduler.phpcore_src/Util/debug_log_rotator/DebugLogRotator.phpcore_src/Util/debug_log_rotator/DebugLogRotationLock.phpcore_src/Bootstrap/service_provider/AdminServiceProvider.php