$_SESSION とは
$_SESSION とは、ユーザーのセッション情報を保存・管理するためのPHPのスーパーグローバル変数の1つです。
どこに保存されるのか?
PHPには、セッションデータの保存と取得を行うためのハンドラを設定する session.save_handler という設定項目があります。
何も設定しない場合のデフォルト値は file のため、セッション情報はローカルファイルとして保存されます。
クラウド環境(マルチインスタンス)での問題点
session.save_handler をデフォルトの file 設定のまま使用する場合、開発環境のように単一のコンテナやサーバーで動かす分には問題ありません。
しかし、AWSやGCPなどのクラウド環境では、負荷分散のために複数のインスタンス(サーバー)が起動していることが一般的です。よって、ファイル形式のセッション管理だと各インスタンスごとにセッション情報を持つため、セッション情報が共有されない問題が発生します。
例えば、インスタンスが2つ立っていてインスタンスAでログインをしたが、別ページへ遷移したときにインスタンスBへルーティングされて、Bにはユーザーのログイン情報が存在しないためにログインしていないとみなされる可能性があります。
解決策:共有ストレージでセッションを管理する
こういった事象を回避するためには、どのインスタンスからもアクセスできる共有ストレージにセッション情報を保存するように設定を変更する必要があります。
具体的には session.save_handler の設定をRedisやMemcached、DB等に変更すればどのインスタンスからも同じセッション情報を扱えるようになります。
// Redisを使う場合の例
ini_set('session.save_handler', 'redis');
// Redisサーバーの接続先も設定
ini_set('session.save_path', 'tcp://127.0.0.1:6379');
まとめ
-
$_SESSIONのデフォルトの保存先は、サーバーのローカルファイル(session.save_handler = file) -
クラウドなどのマルチインスタンス環境 でデフォルト設定のまま利用すると、セッションデータが共有されず、ログイン状態の解除などの不整合が発生する
-
解決策として、
session.save_handlerをRedisなどの共有ストレージに設定する