2012-06-17 6 views
6

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

:私は、デフォルトのセッションの寿命などで、デフォルト(ファイルベース)セッションハンドラを使用しています。 php.iniのすべてがデフォルトです。

今のセッションが開始されている場合は任意のセッションがタイムアウトしている場合、PHPは(非はsession.gc_divisorとsession.gc_probabilityを依存する)のチェックを行います。しかし、どこからPHPをチェックするセッションからの最後のセッションのアクセス時間ですか?

セッションファイル自体は、例えば、専用ワークロードが含まれていますの場合はであるため、最後のセッションアクセス時間に関する情報はありません。

私はセッションがまだ完全なサーバの再起動後に作業しているように、セッションの開始時間に関連したメモリ内の情報がないと思います。

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

答えて

8

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

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

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

+0

お返事ありがとうございます。あなたは「PHPがファイルのmtimeを使用できる」と書いています。私はこれがPHPがデフォルトのファイルベースのセッションハンドラで動作する方法であると確信していますが、これについての公式な声明はありますか? – hacksteak25

+1

いいえ、確かめることができない場合は、いつでもPHPのソースを確認することができます。 「最後の使用時間」はセッションデータ自体にコード化されていないので、セッションファイルのmtimeはそのような情報が利用可能な唯一の場所です。 PHPはどこの場所でもmtimesのデータベースを維持しません。もしそうであれば、そのデータをどこに保存するかを指定する設定オプションがあります。 –

+0

は、ソースを調べるよりも簡単な方法があることを望んだ;)しかし、あなたは正しい。 mtimesのオプションはないので、ファイルのmtime以外は何もないようです。ありがとうございます。 – hacksteak25

関連する問題