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を使用しています。
それを機能させる方法を教えてもらえますか?
ありがとうございました
ガベージコレクターがsession_start()
で開いた/読み取ったセッションファイルをキックインして削除した場合でも、その特定のPHPプロセスの根幹には到達せず、$_SESSION
を削除しませんオブジェクト配列。
標準のファイルベースのセッションハンドラー(serialize()
の$_SESSION
のコピーを含む)を使用していると想定すると、次のようになります。
session_start()
、PHPでファイルを開く/ロックし、その内容を読み取り、データを非直列化し、偶然に、セッションファイルの「最後に使用された」タイムスタンプを更新するUnixボックス)。今、あなたがこのようなことをした場合:
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。セッションファイルはごみ箱に入れられた可能性がありますが、ガベージコレクターはスクリプトの実行中にスクリプトのメモリに存在するものに触れません。
session.gc_maxlifetimeは、ガベージコレクションのためにセッションが(consideredになるまでの秒数です。
session.gc_probabilityおよびsession.gc_divisorは、セッションの初期化時にガベージコレクションが実行される確率を決定します。
マニュアル (私の強調)を読んでください:
session.gc_maxlifetime
は、データが「ガベージ」と見なされて潜在的にクリーンアップされるまでの秒数を指定します。セッションの開始中にガベージコレクションが発生する可能性があります(session.gc_probability
およびsession.gc_divisor
によって異なります)。
同じページで:
session.gc_divisor
とsession.gc_probability
を組み合わせて使用すると、セッションの初期化ごとにgc(ガベージコレクション)プロセスが開始される確率が定義されます。確率はgc_probability/gc_divisor
を使用して計算されます。 1/100は、リクエストごとにGCプロセスが開始される可能性が1%であることを意味します。session.gc_divisor
のデフォルトは100です。
次に、計算を行い、GCが各リクエストで呼び出される可能性が低いことを確認します。
ユーザーの最後のアクティビティの時間を節約する変数をセッションに格納し、セッションの代わりにそれを使用して論理的に「アクティブ」にする必要があります。ガベージコレクションに依存しないでください。