今日私は、厳密に 30 分で期限切れになるセッションを設定する方法についてのニアオ兄弟の記事を読んでいました
私は php のセッション メカニズムに興味を持ち、それを勉強するためにインターネットでいくつかの情報を見つけました
php セッション管理システムは、独自の php.ini ファイルで設定できる多くの構成オプションをサポートしています
php.ini のセッションの設定では、session.save_handler はセッションに関連付けられたデータを保存および取得するプロセッサの名前を定義します。個々の拡張機能が独自の登録済み処理を登録できることに注意してください。プログラムは、phpinfo() を参照することで、インストールごとに利用できます。 session_set_save_handler() を参照してください。
PHP 設定でセッションを処理するには 2 つの方法があります。1 つはデフォルトのファイルで、もう 1 つはユーザー定義です。
1. session.save_handler=ファイル
1. session_start()
1.1 session_start() はセッションメカニズムの始まりです。セッションはファイルに保存されるため、SESSION セッションのリサイクルはこの確率で無効になります。 php.ini (session.save_path) の設定に従って決定されます。
一部のシステムでは session.gc_probability = 0 になっており、これは確率が 0 であることを意味し、ガベージ コレクションは cron スクリプトを通じて実装されます。
<code> session<span>.gc</span>_probability = <span>1</span> session<span>.gc</span>_divisor = <span>100</span> session<span>.gc</span>_maxlifetime = <span>1440</span>//过期时间 默认<span>24</span>分钟 //概率是 session<span>.gc</span>_probability/session<span>.gc</span>_divisor 结果 <span>1</span>/<span>100</span>, //不建议设置过小,因为session的垃圾回收,是需要检查每个文件是否过期的。 session<span>.save</span>_path = //好像不同的系统默认不一样,有一种设置是 <span>"N;/path"</span> //这是随机分级存储,这个样的话,垃圾回收将不起作用,需要自己写脚本</code>
1.2 セッションは現在 $_COOKIE[session_name()] が存在するかどうかを判断します; session_name() は session_id を保存する COOKIE キーの値を返します。この値は php.ini から見つけることができます。
<code><span>session.name </span>=<span> PHPSESSID //默认值PHPSESSID</span></code>
1.3 存在しない場合は、 session_id が生成され、生成された session_id を COOKIE 値としてクライアントに渡します。これは、次の COOKIE オペレーションを実行するのと同じです。このステップでは、COOKIE がヘッダーに送信されるため、この関数を使用する前に別の関数 session_regenerate_id() を実行することはできません。これより前に出力はできません。
<code> setcookie(session_name(), session_id(), session.cookie_lifetime,<span>//</span>默认<span>0</span> session.cookie_path,<span>//</span>默认<span>'/'</span>当前程序跟目录下都有效 session.cookie_domain,<span>//</span>默认为空 )</code>
1.4 存在する場合、 session_id = $_COOKIE[session_name]
次に、session.save_path で指定されたフォルダーに移動して、「SESS_id()」という名前のファイルを見つけます。
ファイルの内容を読み取り、デシリアライズして、$_SESSION グローバル変数
に入れます。
2. 値 を $
_SESSION に割り当てます
たとえば、新しい値 $_SESSION['test']= 'test'; を追加すると、この $_SESSION はスクリプトの実行が終了したときにのみ保持されます。この段階で、session_id を変更する操作を実行できます。
たとえば、古い session_id を破棄し、新しい session_id を生成します。たとえば、Drupal の匿名ユーザーは、ログイン時に SESSION を使用する必要があります。新しいセッションID。
<code>if (<span>isset($_COOKIE[<span>session_name()</span>])</span>) { <span>setcookie(<span>session_name()</span>, <span>''</span>, <span>time()</span> - <span>42000</span>, <span>'/'</span>)</span>;<span>//旧session cookie过期</span> } <span>session_regenerate_id()</span>;<span>//这一步会生成新的session_id</span><span>//session_id()返回的是新的值</span></code>
3. SESSION 操作の書き込み
スクリプトの最後で、SESSION 書き込み操作が実行され、$_SESSION の値が session_id で指定されたファイルに書き込まれます。このファイルは既に存在する場合があり、新しいファイルを作成する必要がある場合があります。
4. セッションを破棄します
SESSION によって送信される COOKIE は通常、メモリに保存され、ブラウザを閉じる代わりにログアウトするなど、手動で有効期限を強制する必要がある場合は、コード内のセッション
方法はたくさんあります。
4.1 setcookie(session_name(), session_id(), time() - 8000000, ..);//ログアウトする前に実行する
4.2 usset($_SESSION);//これにより、すべての $_SESSION データが削除されます。更新後、COOKIE が渡されますが、データはありません。
4.3 session_destroy();//この関数はより完全で、$_SESSION を削除し、セッション ファイルと session_id を削除します
ブラウザを閉じずに再度更新すると、2と3にCOOKIEが送信されますが、データが見つかりません
2. session.save_handler=user
PHP のマニュアルには、ユーザー定義のセッション ストレージ関数を設定するための session_set_save_handler があります。PHP の組み込みセッション ストレージ メカニズム以外の方法を使用したい場合は、この関数を使用できます。 たとえば、セッション ストレージ機能をカスタマイズして、セッション データをデータベースに保存できます。
詳細については、PHP マニュアル http://php.net/manual/zh/function.session-set-save-handler.php
上記では、PHP のセッション メカニズムをその側面も含めて深く理解しました。これが、PHP チュートリアルに興味のある友人に役立つことを願っています。