FuelPHP 1.8 `file’ セッションドライバでセッションデータが保存されない
- 2017年05月10日
- FuelPHP
- FuelPHP, SimpleAuth, XAMPP, セッションドライバ
それまで FuelPHP デフォルトの “cookie” セッションドライバで稼働していたシステムについて、セッションドライバを “file” に変更するとSimpleAuth を使った認証が動作しなくなる、という問題が起きました。
結局これは FuelPHP 1.8 での不具合だったらしく、GitHub にあったコミット差分をこちらのソースに手で適用して解消しました。
Session file driver does not work on Windows
make sure the path uses the correct directory separators; closes #1995
上記の修正は FuelPHP 1.8.0.1 には含まれているので、最近 FuelPHP 1.8 を使い始めていれば問題無いはずです。また FuelPHP 1.7 系以前や、Unix 系の環境 (ディレクトリ区切りが「\」ではない) では関係ありません。
問題に気づいたきっかけは SimpleAuth を使った認証が動作しない、というものでしたが、SimpleAuth に限らず FuelPHP のセッション機能自体が正常に動作しなくなっていました。
参考まで、生じた問題の詳しい状況はこうでした。
- 最近このプロジェクトのソースは FuelPHP 1.8 を使用するように更新した
- 問題が起きた環境は Windows の XAMPP (開発環境)
- SimpleAuth で実装したログインフォームで正しいユーザ名・パスワードを入力してもログインできない (アプリケーション側実装に従いログインフォームにリダイレクトされ戻される)
- 同じソース・同じ環境でセッションドライバを “cookie” に設定すれば、ログインを含めアプリケーションは正常に動作する
- “file” セッションドライバの “path” で設定したパスには、ログインできない場合でもセッションデータを含んだファイルが生成される (ただし、ログイン試行 1 回につき何故か複数セッションファイルが生成される)
- FuelPHP 1.7 で “file” セッションドライバを使用している別プロジェクトでは、こういった問題は起きていないとのこと
- デバッガで追いかけると、”file” ドライバの場合
Session::get()
がその直前に設定した値は返すが、以前のリクエストからの値を返さない
教訓
Google 検索だけに頼らないこと
この件の対応のためそれらしいキーワードで散々 Google 検索を行いましたが、結局原因・解決法そのものはヒットしませんでした。そのタイトル「Session file driver does not work on Windows」で検索してもヒットしないことから、Google では検索対象になっていないようです。
この GitHub issue tracker が FuelPHP 公式のものでしょうから、Google に頼らずそこを調べることを思いつくべきでした。
デバッガが役に立つ
自前アプリケーションのバグと思い調査を始めて、また Google 検索でも情報が得られず苦労しましたが、途中から PHP デバッガ (Eclipse + XDebug) を使い始めてどうにか FuelPHP のソースにある原因に行きつきました。
時間的に制約の厳しいプロジェクトで、デバッガの設定が面倒でそれまで echo
, var_dump()
デバグで凌いでいまいしたが、そのままだともっと時間がかかったはずです。
参考
ITエンジニア募集中!
キュアコード株式会社はITエンジニアを募集しております。少人数の職場なので、上流・下流やサーバー・クライアント対応の垣根なく、あなたの強みを活かしながら いろいろなことにチャレンジ可能です。エンジニアとしての未経験の方、経験が少ない方も歓迎しています。
下記よりITエンジニア募集の採用情報をご覧いただけます。