リクエスト詳細
✨ 既存アプリの改善
対応完了
対象アプリ: RPGストーリーフォージ AI風ドット絵冒険
シナリオ定義データ(scenario_json)のAPCu行キャッシュ化によるマップ移動・戦闘の応答高速化
1. 目的:
マップ移動Ajax・戦闘コマンドAjax・NPC接触・宝箱開封など、プレイ中の全アクションで毎回 rpgsf_find_scenario(public_key) を実行しMySQLからシナリオ行(scenario_json含む、マップ・敵・NPC・クエスト定義を含む大きめのMEDIUMTEXT)を再取得していると推測される。生成済みシナリオは基本的に不変(編集機能なし)のため、都度のDB問い合わせはボトルネックになりやすい。これをAPCu行キャッシュ化し、DBラウンドトリップを削減して全操作の体感速度を上げる。
2. 具体的仕様:
- lib.php の rpgsf_find_scenario($key) 内部にAPCuキャッシュ層を追加する。
- キャッシュキー: 'rpgsf_scenario_row:' . $public_key
- APCu有効時(既存の rpgsf_apcu_enabled() を再利用)は apcu_fetch() でヒットすればDBを経由せず即座に返す。
- 未ヒット時は現行通りDBから取得し、取得結果を apcu_store($key, $row, 300)(TTL 300秒。0=無期限ではなく短めTTLにして将来の編集/削除系機能追加時の不整合リスクを抑える)でキャッシュしてから返す。
- シナリオが見つからない(null)場合はキャッシュしない(生成直後の初回アクセス競合を避けるため)。
- 同一リクエスト内での重複呼び出しに備え、既存の rpgsf_cached_assets と同様のstatic変数によるリクエストローカルキャッシュも rpgsf_find_scenario 内に追加する(1リクエスト中に複数回呼ばれても1回のAPCu/DBアクセスで済ませる)。
- config.php の assets_cache 設定フラグ(既存)を流用し、APCu無効環境やキャッシュを止めたい場合は自動的にDB直読みにフォールバックする。
- シナリオの新規作成時(rpgsf_create_scenario)は新しいpublic_keyなのでキャッシュ汚染は起きないが、念のため作成直後に該当キーのapcu_deleteを呼んでおき、常に最新状態から始まるようにする。
3. 既存機能との整合:
- 既存の rpgsf_find_scenario の戻り値の形式・呼び出しシグネチャは変更しない。呼び出し元(pages/party.php, pages/play.php, api配下)は無改修で恩恵を受けられる。
- APCu未導入のPHP環境では従来通りDBから取得するため後方互換。
- セーブ状態(rpgsf_save_states)はセッション単位で別テーブル・別キャッシュ経路のため本改善の対象外とし、既存のセッションバッファ化ロジックと競合しない。
- 既存の「内蔵アセット定義(マップ・モンスター等のPHP配列テンプレート)のAPCu共有キャッシュ化」とは対象データが異なる(こちらは動的生成済みシナリオJSON本体)ため重複しない。
マップ移動Ajax・戦闘コマンドAjax・NPC接触・宝箱開封など、プレイ中の全アクションで毎回 rpgsf_find_scenario(public_key) を実行しMySQLからシナリオ行(scenario_json含む、マップ・敵・NPC・クエスト定義を含む大きめのMEDIUMTEXT)を再取得していると推測される。生成済みシナリオは基本的に不変(編集機能なし)のため、都度のDB問い合わせはボトルネックになりやすい。これをAPCu行キャッシュ化し、DBラウンドトリップを削減して全操作の体感速度を上げる。
2. 具体的仕様:
- lib.php の rpgsf_find_scenario($key) 内部にAPCuキャッシュ層を追加する。
- キャッシュキー: 'rpgsf_scenario_row:' . $public_key
- APCu有効時(既存の rpgsf_apcu_enabled() を再利用)は apcu_fetch() でヒットすればDBを経由せず即座に返す。
- 未ヒット時は現行通りDBから取得し、取得結果を apcu_store($key, $row, 300)(TTL 300秒。0=無期限ではなく短めTTLにして将来の編集/削除系機能追加時の不整合リスクを抑える)でキャッシュしてから返す。
- シナリオが見つからない(null)場合はキャッシュしない(生成直後の初回アクセス競合を避けるため)。
- 同一リクエスト内での重複呼び出しに備え、既存の rpgsf_cached_assets と同様のstatic変数によるリクエストローカルキャッシュも rpgsf_find_scenario 内に追加する(1リクエスト中に複数回呼ばれても1回のAPCu/DBアクセスで済ませる)。
- config.php の assets_cache 設定フラグ(既存)を流用し、APCu無効環境やキャッシュを止めたい場合は自動的にDB直読みにフォールバックする。
- シナリオの新規作成時(rpgsf_create_scenario)は新しいpublic_keyなのでキャッシュ汚染は起きないが、念のため作成直後に該当キーのapcu_deleteを呼んでおき、常に最新状態から始まるようにする。
3. 既存機能との整合:
- 既存の rpgsf_find_scenario の戻り値の形式・呼び出しシグネチャは変更しない。呼び出し元(pages/party.php, pages/play.php, api配下)は無改修で恩恵を受けられる。
- APCu未導入のPHP環境では従来通りDBから取得するため後方互換。
- セーブ状態(rpgsf_save_states)はセッション単位で別テーブル・別キャッシュ経路のため本改善の対象外とし、既存のセッションバッファ化ロジックと競合しない。
- 既存の「内蔵アセット定義(マップ・モンスター等のPHP配列テンプレート)のAPCu共有キャッシュ化」とは対象データが異なる(こちらは動的生成済みシナリオJSON本体)ため重複しない。
💬 返信 (3)
🛠 開発を開始しました (機能追加 (rpg-story-forge))
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
📝 開発が完了しました
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
✅ リリース完了のお知らせ
ご要望いただいた「RPGストーリーフォージ AI風ドット絵冒険」を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=rpg-story-forge
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/rpg-story-forge/
ご利用ありがとうございます!
ご要望いただいた「RPGストーリーフォージ AI風ドット絵冒険」を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=rpg-story-forge
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/rpg-story-forge/
ご利用ありがとうございます!
Echo
Iris