リクエスト詳細
✨ 既存アプリの改善
対応完了
対象アプリ: RPGストーリーフォージ AI風ドット絵冒険
移動・戦闘AjaxのPHPセッションロック早期解放による連打時レスポンス高速化
1. 目的
マップ移動や戦闘コマンドのAjax APIは、PHPの標準セッション機構によりリクエスト処理中ファイルロックを保持し続ける実装になっている可能性が高い。方向パッド連打やスマホでの素早い移動タップ時、同一セッションからの複数リクエストが発生すると、PHPは同一セッションIDへの並行アクセスをファイルロックで直列化するため、2つ目以降のリクエストが1つ目の処理完了まで待たされ、体感の『もっさり感』の一因になっている。lib.phpには既に rpgsf_release_session_lock() というsession_write_close()呼び出し用の関数が用意されているが、各Ajaxエンドポイント(移動API・戦闘コマンドAPI・NPC会話・ショップ購入など)内で、レスポンスに必要な$_SESSION更新が完了した直後の最も早いタイミングで呼び出されているかを点検し、未使用箇所へ徹底適用する。
2. 具体的な仕様
- api/配下の移動系・戦闘系・ショップ系など、ユーザー操作のたびに呼ばれるAjaxエンドポイント全てを対象に、処理フローを次の順序に統一する:
(1) session_start() 済みの$_SESSIONから現在のstate/セッションバッファを読み出す
(2) 今回のリクエストで$_SESSIONに書き戻す必要のある値(バッファ済み移動ログ、戦闘ターン状態など)を確定して書き込む
(3) rpgsf_release_session_lock() を呼び、直ちにセッションファイルロックを解放する
(4) その後にDBへの永続化判定・レスポンスJSON組み立て・fastcgi_finish_request等の重い処理を行う
- 既にfastcgi_finish_request対応でDB書き込みをレスポンス送信後に遅延実行している箇所についても、セッションロック解放がDB処理より後になっていないか確認し、必ずセッション更新→ロック解放→DB/重い処理、の順に並べ替える。
- 万一、処理途中で例外が発生してもセッションロックが解放されるよう、try/finally もしくは処理の早い段階での解放を徹底する。
- 変更はサーバー内部の処理順序調整のみで、リクエスト/レスポンスのJSON形式・パラメータは一切変更しない。
3. 既存機能との整合
- 出力データ構造やAPIの入出力仕様は変更しないため、フロントエンドJS(map.js/battle.js等)の改修は不要で後方互換。
- 既存の『移動Ajax保存のセッションバッファ化』『戦闘コマンドAjax保存のセッションバッファ化』『DB書き込みの遅延実行』とも併用可能で、セッションロック解放のタイミングを早めるだけの追加調整であり、これまでのキャッシュ・圧縮系の改善と競合しない。
- 同一ブラウザから連打的に発行される複数Ajaxリクエストが並行処理されるようになり、特にスマホでの方向パッド連打・戦闘コマンド連打時の応答遅延が体感で改善される。
マップ移動や戦闘コマンドのAjax APIは、PHPの標準セッション機構によりリクエスト処理中ファイルロックを保持し続ける実装になっている可能性が高い。方向パッド連打やスマホでの素早い移動タップ時、同一セッションからの複数リクエストが発生すると、PHPは同一セッションIDへの並行アクセスをファイルロックで直列化するため、2つ目以降のリクエストが1つ目の処理完了まで待たされ、体感の『もっさり感』の一因になっている。lib.phpには既に rpgsf_release_session_lock() というsession_write_close()呼び出し用の関数が用意されているが、各Ajaxエンドポイント(移動API・戦闘コマンドAPI・NPC会話・ショップ購入など)内で、レスポンスに必要な$_SESSION更新が完了した直後の最も早いタイミングで呼び出されているかを点検し、未使用箇所へ徹底適用する。
2. 具体的な仕様
- api/配下の移動系・戦闘系・ショップ系など、ユーザー操作のたびに呼ばれるAjaxエンドポイント全てを対象に、処理フローを次の順序に統一する:
(1) session_start() 済みの$_SESSIONから現在のstate/セッションバッファを読み出す
(2) 今回のリクエストで$_SESSIONに書き戻す必要のある値(バッファ済み移動ログ、戦闘ターン状態など)を確定して書き込む
(3) rpgsf_release_session_lock() を呼び、直ちにセッションファイルロックを解放する
(4) その後にDBへの永続化判定・レスポンスJSON組み立て・fastcgi_finish_request等の重い処理を行う
- 既にfastcgi_finish_request対応でDB書き込みをレスポンス送信後に遅延実行している箇所についても、セッションロック解放がDB処理より後になっていないか確認し、必ずセッション更新→ロック解放→DB/重い処理、の順に並べ替える。
- 万一、処理途中で例外が発生してもセッションロックが解放されるよう、try/finally もしくは処理の早い段階での解放を徹底する。
- 変更はサーバー内部の処理順序調整のみで、リクエスト/レスポンスのJSON形式・パラメータは一切変更しない。
3. 既存機能との整合
- 出力データ構造やAPIの入出力仕様は変更しないため、フロントエンドJS(map.js/battle.js等)の改修は不要で後方互換。
- 既存の『移動Ajax保存のセッションバッファ化』『戦闘コマンドAjax保存のセッションバッファ化』『DB書き込みの遅延実行』とも併用可能で、セッションロック解放のタイミングを早めるだけの追加調整であり、これまでのキャッシュ・圧縮系の改善と競合しない。
- 同一ブラウザから連打的に発行される複数Ajaxリクエストが並行処理されるようになり、特にスマホでの方向パッド連打・戦闘コマンド連打時の応答遅延が体感で改善される。
💬 返信 (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