php.iniで設定
session_gcmaxlife=5
しましたが、サーバー上のセッション変数は5秒後に破棄されません
PHPでのセッションの最大寿命を5秒に設定します。
一般に、session.gc_maxlifetimeは、セッションデータが最後に変更されてからの最大存続期間を指定すると言うことができます(session_startが最後に呼び出されたときではありません!)。しかし、PHPのセッション処理はもう少し複雑です。
セッションデータは、session.gc_divisorで除算されたsession.gc_probabilityの確率でsession_startによってのみ呼び出されるガベージコレクターによって削除されるためです。デフォルト値は1と100であるため、ガベージコレクターはすべてのsession_start呼び出しの1%でのみ開始されます。つまり、理論的にはセッションがすでにタイムアウトしている場合でも(セッションデータがsession.gc_maxlifetime秒より前に変更されている場合)、セッションデータはそれより長く使用できます。
そのため、独自のセッションタイムアウトメカニズムを実装することをお勧めします。30分後にPHPセッションを期限切れにするにはどうすればよいですか?に対する私の回答を参照してください。詳細については。
最善の解決策は、独自のタイムアウトメカニズムを実装することです。簡単だ。
$_SESSION['created'] = time();
これで、5秒が経過するたびにチェックするifステートメントがあれば十分であり、経過したらセッションデータを破棄します。
if (time() - $_SESSION['created'] > 5) {
session_destroy();
session_unset();
}
setcookie()関数を使用できます。タイムアウトのパラメータを取ります。
$timeout = 5; // 5 seconds
if (isset($_COOKIE[session_name()])){
setcookie(session_name(), $_COOKIE[session_name()], time() + $timeout, "/");
}
次に、FirefoxのCookie Manager +を使用して、セッションが破棄されているかどうかを確認できます。
OK-私には5秒のセッションはかなり無意味に聞こえます(セッションはステートレスアプリケーションでアプリケーションの状態を維持することになっているので...ええ)。
最善の策は、おそらくセッションに有効期限のタイムスタンプ(time()
+ 5秒)を保存する$_SESSION['expires']
ことです。たとえば、セッションを開始するたびに、その変数が存在するかどうかを確認し、存在する場合は(過去に存在する場合)、セッションをオフにして、再開します。
これは機能する可能性のあるもう1つの可能性ですが、セッションを管理するためのオブジェクトを作成する必要があります。kill()
その場合、セッションの有効期限が切れた場合に呼び出すことができるメソッドを作成できます。この__destruct()
メソッドでは、デストラクタのように完全な証明ではありません。オブジェクトが破棄されたときにのみ呼び出されますが、機能するはずです。
class Session {
private static $_instance;
//private constructor to prevent external instantiation
private function __construct($sSessName, $sSavePath, $iGCLifetime, $sCookieDomain, $sCookiePath) {
//session parameters
ini_set("session.save_path", $sSavePath);
ini_set("session.gc_maxlifetime", $iGCLifetime);
ini_set("session.use_trans_sid", false);
//session cookie parameters
ini_set("session.use_cookies", true);
ini_set("session.use_only_cookies", true);
ini_set("session.cookie_domain", $sCookieDomain);
ini_set("session.cookie_path", $sCookiePath);
ini_set("session.cookie_lifetime", 0);
//set the session name
session_name($sSessName);
//set the session cookie paramaters
session_set_cookie_params(0, $sCookiePath, $sCookieDomain);
//start the session
session_start();
//check to see if the session has expired - and if so kill it
if(isset($_SESSION['expires']) && time() > $_SESSION['expires']) {
$this->kill();
}
//if not - set the expiry time in the session
else {
$_SESSION['expires'] = time() + 5;
}
}
//destructor function _should_ kill the $_SESSION when the object is destroyed
public function __destruct() {
$this->kill();
}
//session killer
public function kill() {
//kill the session cookie
setcookie(session_name(), null, time()-3600);
//kill the session
session_unset();
session_destroy();
}
//Singleton instance getter
public function getInstance() {
if(!self::$_instance) self::$_instance = new self();
return self::$_instance;
}
}
$_SESSION変数のタイムスタンプ属性を含めます。定期的に確認し、条件に従ってセッションを期限切れにします。
$_SESSION['mytimestamp'] = time();