-1

php.iniで設定 session_gcmaxlife=5 しましたが、サーバー上のセッション変数は5秒後に破棄されません

PHPでのセッションの最大寿命を5秒に設定します。

4

4 に答える 4

4

一般に、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();
}
于 2012-04-26T14:46:38.780 に答える
1

setcookie()関数を使用できます。タイムアウトのパラメータを取ります。

$timeout = 5; // 5 seconds 
if (isset($_COOKIE[session_name()])){
    setcookie(session_name(), $_COOKIE[session_name()], time() + $timeout, "/");
}

次に、FirefoxのCookie Manager +を使用して、セッションが破棄されているかどうかを確認できます。

ソース

于 2012-04-26T14:29:31.473 に答える
1

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;
  }
}
于 2012-04-26T14:48:43.647 に答える
-1

$_SESSION変数のタイムスタンプ属性を含めます。定期的に確認し、条件に従ってセッションを期限切れにします。

$_SESSION['mytimestamp'] = time();
于 2012-04-26T14:26:00.467 に答える