リクエスト詳細
✨ 既存アプリの改善
対応完了
対象アプリ: RPGストーリーフォージ AI風ドット絵冒険
シナリオ本体(scenario_json)のAPCuキャッシュ化によるマップ移動・戦闘の応答高速化
1. 目的:
マップ移動・戦闘・NPC会話・ショップなどプレイ中のAjax処理は、毎リクエストで rpgsf_find_scenario() がMySQLへ問い合わせてシナリオ本体(MEDIUMTEXT の scenario_json、マップタイル・敵テーブル・NPC・宝箱定義などを含む大きめのJSON)をロードし、都度 json_decode している。シナリオは生成後に内容が変わらないデータであるにもかかわらず、プレイ中の全操作でこのDB読込+デコードが繰り返されており、既存のライブラリ統計・一覧のAPCuキャッシュ化と同様の手法をプレイ中の全動作(移動・戦闘・会話・ショップ・セーブ/ロード)に広げることで、DB負荷とCPU負荷の両方を削減し体感速度を上げる。
2. 具体的な仕様:
- lib.php の rpgsf_find_scenario($key) 内部に APCu キャッシュ層を追加する。
- APCu利用可否は apcu_enabled() 相当のチェック関数(function_exists('apcu_fetch') && ini_get('apc.enabled'))で判定し、既存のライブラリ統計キャッシュと同じ判定ロジックを再利用する。
- キャッシュキーは 'rpgsf_scenario_' . $public_key とする。
- キャッシュ値には scenario 配列全体(id, public_key, title, theme, difficulty, デコード済み scenario_json, created_at 等)を保存し、TTLは 1800秒程度とする。
- キャッシュヒット時はDBアクセス・json_decodeをスキップしてそのまま返却する。
- キャッシュミス時は従来通りDBから取得しjson_decodeした結果をAPCuへ保存してから返す。
- APCu非対応環境では従来通りDB直読み(フォールバック)とし、動作は変わらない。
- シナリオは仕様上作成後に更新されない前提のため、更新系の特別な無効化処理は不要だが、念のためシナリオ削除・再生成系の処理がある場合はキャッシュキーを apcu_delete() で明示的に削除するフックを1箇所追加する(現状シナリオ編集APIが無ければこの手順は省略可)。
- rpgsf_find_scenario() の戻り値の型・キー構成は変更しない(呼び出し元の pages/party.php, pages/play.php 等は無改修で動作)。
3. 既存機能との整合:
- 戻り値の構造・キーは完全に維持するため、party.php / play.php など既存呼び出し箇所は変更不要。
- APCu未導入のレンタルサーバー環境でも自動的にDB直読みへフォールバックし、これまで通り動作する(後方互換)。
- 既存のライブラリ統計APCuキャッシュ機構やFULLTEXT検索、差分state応答、マップ背景Canvasキャッシュなど過去の高速化施策とは独立した層のキャッシュであり、競合・重複はしない。
- キャッシュはシナリオ本体(静的データ)のみを対象とし、プレイヤーごとの進行状態(rpgsf_save_states)はキャッシュ対象に含めないため、セーブ/ロードの整合性やマルチセッションの動作には影響しない。
マップ移動・戦闘・NPC会話・ショップなどプレイ中のAjax処理は、毎リクエストで rpgsf_find_scenario() がMySQLへ問い合わせてシナリオ本体(MEDIUMTEXT の scenario_json、マップタイル・敵テーブル・NPC・宝箱定義などを含む大きめのJSON)をロードし、都度 json_decode している。シナリオは生成後に内容が変わらないデータであるにもかかわらず、プレイ中の全操作でこのDB読込+デコードが繰り返されており、既存のライブラリ統計・一覧のAPCuキャッシュ化と同様の手法をプレイ中の全動作(移動・戦闘・会話・ショップ・セーブ/ロード)に広げることで、DB負荷とCPU負荷の両方を削減し体感速度を上げる。
2. 具体的な仕様:
- lib.php の rpgsf_find_scenario($key) 内部に APCu キャッシュ層を追加する。
- APCu利用可否は apcu_enabled() 相当のチェック関数(function_exists('apcu_fetch') && ini_get('apc.enabled'))で判定し、既存のライブラリ統計キャッシュと同じ判定ロジックを再利用する。
- キャッシュキーは 'rpgsf_scenario_' . $public_key とする。
- キャッシュ値には scenario 配列全体(id, public_key, title, theme, difficulty, デコード済み scenario_json, created_at 等)を保存し、TTLは 1800秒程度とする。
- キャッシュヒット時はDBアクセス・json_decodeをスキップしてそのまま返却する。
- キャッシュミス時は従来通りDBから取得しjson_decodeした結果をAPCuへ保存してから返す。
- APCu非対応環境では従来通りDB直読み(フォールバック)とし、動作は変わらない。
- シナリオは仕様上作成後に更新されない前提のため、更新系の特別な無効化処理は不要だが、念のためシナリオ削除・再生成系の処理がある場合はキャッシュキーを apcu_delete() で明示的に削除するフックを1箇所追加する(現状シナリオ編集APIが無ければこの手順は省略可)。
- rpgsf_find_scenario() の戻り値の型・キー構成は変更しない(呼び出し元の pages/party.php, pages/play.php 等は無改修で動作)。
3. 既存機能との整合:
- 戻り値の構造・キーは完全に維持するため、party.php / play.php など既存呼び出し箇所は変更不要。
- APCu未導入のレンタルサーバー環境でも自動的にDB直読みへフォールバックし、これまで通り動作する(後方互換)。
- 既存のライブラリ統計APCuキャッシュ機構やFULLTEXT検索、差分state応答、マップ背景Canvasキャッシュなど過去の高速化施策とは独立した層のキャッシュであり、競合・重複はしない。
- キャッシュはシナリオ本体(静的データ)のみを対象とし、プレイヤーごとの進行状態(rpgsf_save_states)はキャッシュ対象に含めないため、セーブ/ロードの整合性やマルチセッションの動作には影響しない。
💬 返信 (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