7

特定のセッションがタイムアウトしたことを PHP がどのように検出するのか疑問に思っています。

詳細: デフォルトの (ファイル ベースの) セッション ハンドラーを使用しており、デフォルトのセッション ライフタイムなどがあります。php.ini のすべてがデフォルトです。

セッションが開始された場合、PHP は (session.gc_divisor と session.gc_probability 以外に応じて) タイムアウトしたセッションがあるかどうかをチェックします。しかし、PHP はセッションからの最終セッション アクセス時刻をどこから取得してチェックするのでしょうか?

セッション ファイル自体には、たとえば のワークロードのみが含まれているx|i:1;ため$_SESSION['x'] = 1;、最後のセッション アクセス時間に関する情報はありません。

サーバーの完全な再起動後もセッションは引き続き機能しているため、セッションの開始時間に関連するメモリ内情報はないと思います。

では、PHP はどこから情報を取得するのでしょうか。セッションファイルの mtime/ctime を比較していますか?

4

1 に答える 1

8

serialize()PHPのデフォルトのセッションハンドラーは、。で指定されたディレクトリにある、を使用してファイルに$_SESSIONデータを格納しますsession.save_path。通常、ファイル名はのようになります$filename = 'sess_' . session_id()

これは単なるファイルであるため、PHPはファイルのmtime(最終変更時刻)を使用して、どのセッションファイルが古くなっているかを判断できます。基本的に、mtimeがsession.gc_maxlifetime値を超えるすべてのセッションファイルとunlink()それらを取得します。あなたが言ったように、クリーンアップが発生する確率はsession.gc_*ini変数によって支配されます。

これで、を使用して独自のセッションハンドラーを作成するとsession_set_save_handler()、これはすべてウィンドウの外にあり、セッションの保存方法とクリーンアップ方法を制御できるようになりますが、これはデフォルトの動作を説明しています。

于 2012-06-17T14:30:09.723 に答える