PHPでのセッション有効期限の設定
インターネット上の多くの人が、php 設定ファイルの session.gc_maxlifetime を変更するという答えを与えています。セッションのリサイクル メカニズムについて詳しく知りたい場合は、読み続けてください。 (この記事の環境はphp5.2です)
概要: すべてのphpリクエストは1/100の確率(デフォルト値)で「セッションのリサイクル」をトリガーします。 「セッションのリサイクル」が発生した場合、/tmp/sess_* ファイルがチェックされ、最終変更時間が 1440 秒 (gc_maxlifetime の値) を超えた場合、これらのファイルは削除されます。これは、これらのセッションが期限切れになったことを意味します。
1. セッションはサーバー側 (通常は PHP モジュールを備えた Apache) にどのように存在しますか?
デフォルトでは、php はセッションを /tmp ディレクトリに保存し、ファイル名は sess_01aab840166fd1dc253e3b4a3f0b8381 のようになります。各ファイルはセッションに対応します。
詳細 /tmp/sess_01aab840166fd1dc253e3b4a3f0b8381
username|s:9:”jiangfeng”;admin|s:1:”0〃;
#変数名|type:length:value
削除ここでのセッション ファイルは、対応するセッションが無効であることを意味します。
2. セッションはクライアント側 (通常はブラウザ) にどのように存在するのでしょうか?
セッションは、ブラウザ側では、セッション ID (サーバーによって生成された一意の ID) で十分です。セッション ID を Cookie に保存する場合と、URL に保存する方法の 2 つがあります。ブラウザー Cookie の PHPSESID 変数。URL によって渡される場合、次の形式で URL が表示されます:
index.php?PHPSESID=01aab840166fd1dc253e3b4a3f0b8381 (サーバー側で使用されるメソッドを制御するには session.use_cookies を使用します)
3. サーバー側では、PHP はセッション ファイルの有効期限が切れているかどうかをどのように判断しますか?
「現在」の「最終変更時刻」が gc_maxlifetime (デフォルトは 1440) 秒を超えている場合、セッション ファイルは次のように期限切れとみなされます。セッションがリサイクルされるとき、ファイルが変更されていない場合、セッション ファイルは削除されます (セッションは期限切れになります)。
にログインすると、セッションは期限切れになります。 Web サイトの場合、1440 秒 (デフォルト値) の場合、対応するセッションは期限切れとみなされます。
したがって、php.ini ファイルの gc_maxlifetime 変数を変更すると、セッションの有効期限を延長できます。 : (たとえば、有効期限は 86400 秒に変更されます)
session.gc_maxlifetime = 86400
その後、Web サービス (通常は Apache) を再起動するだけです
注: セッションphp5 の有効期限が切れています。ここでの時間は 86400 秒です。セッションが 86400 秒以内に変更されない場合、次の「リサイクル」まで削除されません。セッションの「リサイクル」は発生しますか?
デフォルトでは、すべての php リクエストに対して 1/100 の確率でリサイクルが行われるため、単純に「100 php リクエストごとに 1 つのリサイクルが発生する」と理解できます。次のパラメータによって制御される
# 確率は gc_probability/gc_divisor
session.gc_probability = 1
session.gc_divisor = 100
です。 注 1: この場合、gc_maxlifetime=120 であると仮定します。セッション ファイルが最後に変更されたのは 120 秒前であるため、セッションは次のリサイクル (1/100 の確率) が発生するまで有効です。
注 2: セッションが session.save_path を使用してセッションを別の場所に保存する場合、セッションのリサイクル メカニズムは期限切れのセッション ファイルを自動的に処理しない可能性があります。現時点では、期限切れのセッションを手動 (または crontab) で削除する必要があります: cd /path/to/sessions; find -cmin +24 | いくつかの特殊なケース
リサイクルのため、メカニズムはファイルの「最終変更時刻」をチェックするため、セッションがアクティブであってもセッションの内容が変更されていない場合、対応するセッション ファイルは変更されていないため、リサイクル メカニズムはこれを考慮します。長期間非アクティブなセッションになった場合は、セッションを削除します。これは見たくないものですが、次の簡単なコードを追加することでこの問題を解決できます。
if(!isset($_SESSION['last_access'])| |(time ()-$_SESSION['last_access'])>60)
$_SESSION['last_access'] = time();
?>コードは 60 秒ごとにセッションの変更を試みます。
概要: セッションの有効期限を変更したい場合は、変数 gc_maxlifetime を変更するだけです。 PHP5 のセッションは、受動的なリサイクル メカニズム (ガベージ コレクション) を使用します。期限切れのセッション ファイルは自然には消えませんが、期限切れのセッションは「リサイクル」をトリガーして処理されます。