Skip to content

P-WORLDメール取得・TTLバッチ

目的

P-WORLD 配信メールを IMAP で取得・保存し、必要に応じてメール本文・関連画像・GIF 添付の TTL パージを実行する。取得経路は、管理画面から起動する手動非同期ジョブと、WP-Cron による定期ジョブの2つ。

管理画面と admin-ajax の契約は ADM-001 P-WORLDメールアーカイブ管理画面EP-一覧 を参照する。

トリガー

トリガー実行内容
pworld_archive_run手動取得ジョブを pworld_archive_async_run として単発 WP-Cron に登録する
pworld_archive_async_run管理画面から起動された IMAP 取得を実行する
admin_init定期取得またはメール本文 TTL が有効な場合、定期 slot の単発 WP-Cron を同期する
pworld_archive_cron_settings_save定期取得・TTL 設定を保存し、定期 slot を再登録する
pworld_archive_scheduled_job定期 IMAP 取得、メール TTL パージ、GIF TTL パージを実行する

手動取得ジョブ

PworldArchiveAdminPage::ajax_run() が入力を検証し、ジョブ状態を runningjob_type=imap_fetch)にしたうえで pworld_archive_async_run を単発登録する。

項目内容
実行クラスPworldArchiveAsyncRunner
入力job_id, date_from, date_to, limit
件数上限1〜500。未指定または範囲外はデフォルト 5
排他PworldArchiveMysqlRunLock
成功時PworldArchiveJobState::set_done() に取得結果を保存する
失敗時PworldArchiveJobState::set_error() にエラーを保存する

同時実行で MySQL ロックを取れない場合は、先行ジョブの完了状態を壊さないため、ジョブ状態は running のまま維持してログだけ出す。

バルク記事連携保存ジョブ(Issue #2052)

PworldArchiveAdminPage::ajax_bulk_save_article_links() が行を同期検証し、ジョブ状態を runningjob_type=bulk_article_link)にしたうえで同一 Cron hook pworld_archive_async_run を単発登録する。Runner は bulk_update_article_links のみ実行し、一覧ペイロードは ajax_job_status 完了時にマージする。手動 IMAP 取得と JobState / MySQL ロックを共有する。

項目内容
実行クラスPworldArchiveAsyncRunnerhandle 内で job_type 分岐)
入力検証済み rows、一覧ページ・フィルタ(JobState params)
排他PworldArchiveMysqlRunLock + 単一 pworld_archive_job_state
成功時set_done({ updated_count })
失敗時set_error()
stale 閾値BULK_STALE_THRESHOLD_SECONDS(180 秒。IMAP 用 720 秒とは別)

定期ジョブ

PworldArchiveCronScheduler が、サイトタイムゾーンの壁時計に寄せた単発イベント連鎖で定期 slot を登録する。

項目内容
実行クラスPworldArchiveScheduledCronRunner
Cron hookpworld_archive_scheduled_job
slot2100, 2200, 2230
登録条件定期取得またはメール本文 TTL が有効
排他PworldArchiveScheduledMysqlRunLock
ログPworldArchiveScheduledJobLogger に status / fetch / ttl / gif_ttl を保存する

定期ジョブは、旧 daily 再発火モデルから単発連鎖モデルへ移行するため、Cron 実行時またはスケジュール同期時に maybe_upgrade_cron_event_model() を実行する。GIF TTL は定期ジョブ実行時に有効なら処理されるが、現行のスケジュール登録条件は定期取得またはメール本文 TTL の有効化である。

TTL パージ

対象保持日数件数上限dry-run削除対象
メール本文・関連画像管理画面設定。既定 90 日管理画面設定。既定 50 件管理画面設定。既定 ON保持期間を超えたメール、本文内画像、関連参照
GIF 添付管理画面設定。既定 30 日管理画面設定。既定 50 件管理画面設定。既定 ON_pworld_gif_expires_at を過ぎた GIF 添付のみ

GIF TTL では代表静止画添付は削除しない。代表静止画の選択ルールは P-WORLD 取り込み GIF:代表静止画・TTL を参照する。

定期ジョブの処理内容

  1. Cron event model の移行が必要なら単発連鎖へ再登録する。
  2. slot が許可リスト外なら終了する。
  3. 定期取得・メール TTL・GIF TTL がすべて無効なら終了する。
  4. MySQL ロックを取得する。取得できない場合は skipped/lock_not_acquired としてログに残す。
  5. 定期取得が有効なら PworldArchiveService::run(null, null, limit) を実行する。
  6. メール TTL が有効なら PworldMailTtlPurgeServiceInterface::purge() を実行する。
  7. GIF TTL が有効なら PworldGifTtlPurgeServiceInterface::purge() を実行する。
  8. 実行結果を保存し、ロックを解放する。
  9. 単発連鎖モデル移行直後でなければ、同 slot の次回イベントを登録する。

定期ジョブで \Throwable が発生した場合は、PworldArchiveScheduledJobLoggerstatus: error として記録する。

関連処理

メール保存成功後には、日別ホールサムネイル自動生成が呼び出される。GIF バックフィルや GIF 代表静止画再生成は、管理画面の明示操作から起動される保守処理であり、本定期取得ジョブとは別経路で実行する。

参照ファイル

  • core_src/Admin/pworld_archive/PworldArchiveAdminPage.php
  • core_src/Admin/pworld_archive/PworldArchiveAsyncRunner.php
  • core_src/Admin/pworld_archive/PworldArchiveCronScheduler.php
  • core_src/Admin/pworld_archive/PworldArchiveScheduledCronRunner.php
  • core_src/Admin/pworld_archive/PworldArchiveCronSettings.php
  • core_src/Admin/pworld_archive/PworldArchiveJobState.php
  • core_src/Bootstrap/service_provider/AdminServiceProvider.php