ホームページ >バックエンド開発 >PHPチュートリアル >PHP_PHP チュートリアルでのセッション有効期限設定とセッション リサイクル メカニズムの概要
インターネット上の多くの人が、設定ファイルの session.gc_maxlifetime を変更するという答えを出しました。セッションのリサイクル メカニズムについて詳しく知りたい場合は、読み続けてください。 (この記事の環境はphp5.2です)
概要: すべてのphpリクエストは1/100の確率(デフォルト値)で「セッションのリサイクル」をトリガーします。 「セッションのリサイクル」が発生すると、/tmp/sess_* ファイルがチェックされ、最終変更時間が 1440 秒 (gc_maxlifetime の値) を超える場合、これらのファイルは削除されます。これは、これらのセッションが期限切れになったことを意味します。
1. セッションは最後にどのように存在しますか (通常は PHP モジュールを使用します)。
デフォルトでは、php はセッションを /tmp ディレクトリに保存し、ファイル名は sess_01aab840166fd1dc253e3b4a3f0b8381 のようになります。各ファイルはセッションに対応します。
詳細 /tmp/sess_01aab840166fd1dc253e3b4a3f0b8381
username|s:9:”jiangfeng”;admin|s:1:”0″;
#変数名|型: 長さ: 値
失敗した対応するセッションを表すセッション ファイルをここで削除します。
2. セッションはクライアント側 (通常はブラウザ) にどのように存在しますか?
セッションはブラウザ側にあり、セッションID(サーバー側で生成された一意のID)を保存するだけで済みます。保存するには、Cookie と URL の 2 つの方法があります。セッション ID が Cookie に保存されている場合は、ブラウザーの Cookie に PHPSESID 変数があることがわかります。 URL で渡された場合は、
index.php?PHPSESID=01aab840166fd1dc253e3b4a3f0b8381 の形式で URL を確認できます。 (サーバー側では、session.use_cookies を使用して、どのメソッドが使用されるかを制御します)
3. サーバー側では、PHP はセッション ファイルの有効期限が切れているかどうかをどのように判断しますか?
「現在」までの「最終変更時刻」が gc_maxlifetime (デフォルトは 1440) 秒を超えた場合、セッション ファイルは次のセッションのリサイクル中に期限切れとみなされ、ファイルが変更されていない場合、このセッション ファイルは削除されます。 (セッションは期限切れになります)。
簡単に言えば、Web サイトにログインし、1440 秒 (デフォルト値) 以内に操作がなかった場合、対応するセッションは期限切れになったと見なされます。
そこで、php.ini ファイルの gc_maxlifetime 変数を変更して、セッションの有効期限を延長します: (たとえば、有効期限を 86400 秒に変更します)
session.gc_maxlifetime = 86400
その後、Web サービスを再起動します (通常はapache)で対応します。
注: PHP5 は、セッションの有効期限が切れたときにリサイクルメカニズムを使用します。ここで設定した時間は 86400 秒です。セッションが 86400 秒以内に変更されなかった場合、セッションは次の「リサイクル」まで削除されません。
3. セッションの「リサイクル」はいつ行われますか?
デフォルトでは、すべての 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 Time" なので、セッションがアクティブであってもセッションの内容が変更されていない場合は、対応するセッション ファイルが変更されていない場合、リサイクル メカニズムはこれを長期間アクティブでなかったセッションとみなして削除します。これは私たちが見たくないものです。次の簡単なコードを追加することでこの問題を解決できます:
コードをコピー
www.bkjia.com