リクエスト詳細
✨ 既存アプリの改善
対応完了
対象アプリ: RPGストーリーフォージ AI風ドット絵冒険
セッション排他ロックの早期解放によるAjax同時リクエストの高速化
1. 目的
PHPの標準セッションハンドラは、session_start()を呼んだリクエストがセッションファイルを排他ロックしたまま処理を続け、レスポンスを返すかsession_write_close()するまでロックを保持する。マップ移動・戦闘コマンド・隣接タイル/敵画像のプリフェッチ・バックグラウンド自動保存など、同一セッションに対する複数のAjaxリクエストがほぼ同時に発生する現状の実装では、後発のリクエストが前のリクエストのセッションロック解放待ちでキュー化され、体感速度が頭打ちになっている(特にスマホでの連続タップやプリフェッチ同時発火時に顕著)。これまでの改善はペイロード削減・キャッシュ化・予測描画が中心で、セッションロック競合には未着手のため、ここを解消して全操作の応答速度を底上げする。
2. 具体的な仕様
- lib.phpに `rpgsf_release_session_lock(): void` を追加。中身は `if (session_status() === PHP_SESSION_ACTIVE) { session_write_close(); }`。
- マップ移動Ajax、戦闘ターン処理Ajax、隣接タイル/敵画像プリフェッチAjax、旅の記憶帳・図鑑取得などの読み取り専用API入口で、`$_SESSION['session_key']`(または認証に必要な最小限の値)を読み取った直後、DBアクセスや手続き生成・戦闘計算などの重い処理を始める前に `rpgsf_release_session_lock()` を呼び出す。
- 状態保存を伴うエンドポイント(マップ移動確定、戦闘結果反映、オートセーブ)では、`$_SESSION` への書き込みが必要な処理(CSRFトークン更新等)を先に完了させてから即座にロックを解放し、以降のシナリオstate生成・MySQL保存・JSON整形はロック解放後に実行する。
- 既存のレスポンス即時返却+バックグラウンド保存の仕組み(過去改善)はそのまま維持しつつ、その前段のセッションロック区間を最小化することで、プリフェッチや連続操作のAjaxが並列に処理されるようにする。
- 変更はサーバー内部の処理順序調整のみで、レスポンス形式・データ構造・APIのURLやパラメータは一切変更しない。
3. 既存機能との整合
- クライアント側のJS(予測描画、差分Ajax、プリフェッチ、fastTap等)は無変更で動作する。
- CSRFトークンやセッション認証のロジックはそのまま維持し、必要な書き込みを終えた後にロックを解放するだけなので、セキュリティ・整合性への影響はない。
- 冒険の書のセーブ/ロード、共有URL経由のプレイ、公開シナリオ一覧など他機能には影響しない。
PHPの標準セッションハンドラは、session_start()を呼んだリクエストがセッションファイルを排他ロックしたまま処理を続け、レスポンスを返すかsession_write_close()するまでロックを保持する。マップ移動・戦闘コマンド・隣接タイル/敵画像のプリフェッチ・バックグラウンド自動保存など、同一セッションに対する複数のAjaxリクエストがほぼ同時に発生する現状の実装では、後発のリクエストが前のリクエストのセッションロック解放待ちでキュー化され、体感速度が頭打ちになっている(特にスマホでの連続タップやプリフェッチ同時発火時に顕著)。これまでの改善はペイロード削減・キャッシュ化・予測描画が中心で、セッションロック競合には未着手のため、ここを解消して全操作の応答速度を底上げする。
2. 具体的な仕様
- lib.phpに `rpgsf_release_session_lock(): void` を追加。中身は `if (session_status() === PHP_SESSION_ACTIVE) { session_write_close(); }`。
- マップ移動Ajax、戦闘ターン処理Ajax、隣接タイル/敵画像プリフェッチAjax、旅の記憶帳・図鑑取得などの読み取り専用API入口で、`$_SESSION['session_key']`(または認証に必要な最小限の値)を読み取った直後、DBアクセスや手続き生成・戦闘計算などの重い処理を始める前に `rpgsf_release_session_lock()` を呼び出す。
- 状態保存を伴うエンドポイント(マップ移動確定、戦闘結果反映、オートセーブ)では、`$_SESSION` への書き込みが必要な処理(CSRFトークン更新等)を先に完了させてから即座にロックを解放し、以降のシナリオstate生成・MySQL保存・JSON整形はロック解放後に実行する。
- 既存のレスポンス即時返却+バックグラウンド保存の仕組み(過去改善)はそのまま維持しつつ、その前段のセッションロック区間を最小化することで、プリフェッチや連続操作のAjaxが並列に処理されるようにする。
- 変更はサーバー内部の処理順序調整のみで、レスポンス形式・データ構造・APIのURLやパラメータは一切変更しない。
3. 既存機能との整合
- クライアント側のJS(予測描画、差分Ajax、プリフェッチ、fastTap等)は無変更で動作する。
- CSRFトークンやセッション認証のロジックはそのまま維持し、必要な書き込みを終えた後にロックを解放するだけなので、セキュリティ・整合性への影響はない。
- 冒険の書のセーブ/ロード、共有URL経由のプレイ、公開シナリオ一覧など他機能には影響しない。
💬 返信 (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