web-dev-qa-db-ja.com

PHP-ini_set( 'session.gc_maxlifetime'、5)-なぜセッションが終了しないのですか?

PHPスクリプトは次のとおりです。

<?php // continue.php
ini_set('session.gc_maxlifetime', 5);
session_start();
echo ini_get('session.gc_maxlifetime');
// wait for 7 seconds
usleep(7000000);
if (isset($_SESSION['username']))
{
    $username = $_SESSION['username'];
    $password = $_SESSION['password'];
    $forename = $_SESSION['forename'];
    $surname  = $_SESSION['surname'];

    echo "Welcome back $forename.<br />
          Your full name is $forename $surname.<br />
          Your username is '$username'
          and your password is '$password'.";
}
else echo "Please <a href=authenticate2.php>click here</a> to log in.";

?>

タイムアウト(5秒など)に基づいて、スクリプトは何も出力しません。ただし、次のメッセージがまだ表示されます

5Welcome back Bill. Your full name is Bill Smith. Your username is 'bsmith' and your password is 'mysecret'.

Ini_set( 'session.gc_maxlifetime'、5)という行は、本来あるべきように機能しないようです。私はwindowsXP + XAMMPを使用しています。

それを機能させる方法を教えてもらえますか?

ありがとうございました

18
q0987

ガベージコレクターがsession_start()で開いた/読み取ったセッションファイルをキックインして削除した場合でも、その特定のPHPプロセスの根幹には到達せず、$_SESSIONを削除しませんオブジェクト配列。

標準のファイルベースのセッションハンドラー(serialize()$_SESSIONのコピーを含む)を使用していると想定すると、次のようになります。

  1. セッションファイルは一時ディレクトリにあります
  2. あなたsession_start()、PHPでファイルを開く/ロックし、その内容を読み取り、データを非直列化し、偶然に、セッションファイルの「最後に使用された」タイムスタンプを更新するUnixボックス)。
  3. 5つ目の家の星と月が海王星のアセンダントと正しく位置合わせされている場合、セッションガベージコレクター[〜#〜]可能性[〜#〜]が発火します古いセッションファイルをアップして削除します。
  4. ガベージコレクターは、セッションディレクトリを繰り返し処理し、max_liftimeより古いファイルを削除しますただし、現在開いているファイルや使用中のファイルは削除されません。セッションをクローズ()していないので、セッションのファイルはまだ使用されているため、削除されません。

今、あなたがこのようなことをした場合:

ini_set(...); // set GC probability to max, short session lifetime, etc...

session_start(); // populate $_SESSION
session_write_close(); // dump $_SESSION out to file, close file, release lock.

sleep(7); // Sleep for 7 seconds;

session_start(); // re-populate $_SESSION;

これで、新しい空の$ _SESSIONになる可能性があります[〜#〜] if [〜#〜]ガベージコレクターが起動することを決定します。ただし、2番目のsession_start()、前のstart()コールからの古い$ _SESSIONデータWILL STILL BE PRESENT。セッションファイルはごみ箱に入れられた可能性がありますが、ガベージコレクターはスクリプトの実行中にスクリプトのメモリに存在するものに触れません。

36
Marc B

session.gc_maxlifetimeは、ガベージコレクションのためにセッションがconsideredになるまでの秒数です。

session.gc_probabilityおよびsession.gc_divisorは、セッションの初期化時にガベージコレクションが実行される確率を決定します。

9
Mark Baker

マニュアル (私の強調)を読んでください:

session.gc_maxlifetimeは、データが「ガベージ」と見なされて潜在的にクリーンアップされるまでの秒数を指定します。セッションの開始中にガベージコレクションが発生する可能性があります(session.gc_probabilityおよびsession.gc_divisorによって異なります)。

同じページで:

session.gc_divisorsession.gc_probabilityを組み合わせて使用​​すると、セッションの初期化ごとにgc(ガベージコレクション)プロセスが開始される確率が定義されます。確率はgc_probability/gc_divisorを使用して計算されます。 1/100は、リクエストごとにGCプロセスが開始される可能性が1%であることを意味します。 session.gc_divisorのデフォルトは100です。

次に、計算を行い、GCが各リクエストで呼び出される可能性が低いことを確認します。

ユーザーの最後のアクティビティの時間を節約する変数をセッションに格納し、セッションの代わりにそれを使用して論理的に「アクティブ」にする必要があります。ガベージコレクションに依存しないでください。

4
Artefacto