ホームページ  >  記事  >  バックエンド開発  >  PHPセッションが期限切れにならず、SessionIdが変更されない問題を完全に解決_PHPチュートリアル

PHPセッションが期限切れにならず、SessionIdが変更されない問題を完全に解決_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-14 10:10:381232ブラウズ

asp.net でセッションを使用し、次に php でセッションを使用すると、php でのセッションは asp.net でのセッションに比べて非常に不快だと感じるでしょう。 PHP セッションを使用する場合、セッションが無効にならない、ブラウザを閉じてもセッションがまだ存在する、ブラウザを再度開いてもセッション ID が以前と同じままであるなどの問題が発生することがあります。 。 。


PHP のセッションメカニズムを見てみましょう:

セッションリサイクルメカニズム:

PHP は期限切れのセッションをリサイクルするためにガベージ コレクション プロセスを使用しますが、セッションが確立されるたびに「ガベージ コレクション」プロセスが起動されるわけではありません。これは主にサーバーのパフォーマンスを考慮したもので、ビュー数が多いとサーバーが耐えられなくなり、セッションが期限切れになります。メカニズムが正常に動作し、サーバーの効率が節約されます。詳細は長年の経験から導き出されるはずです。

PHP セッションの有効期限に関連する 3 つのパラメーター (php.ini 内):

session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 1440

gc 起動確率 = gc_probability / gc_divisor = 0.1%

セッション有効期限 gc_maxlifetime 単位: 秒


Webサービスを正式に提供する場合、セッションの有効期限はWebサービスの閲覧数やサーバーの性能などから総合的に考慮する必要があります。セッションごとに gc を有効にするのは明らかに賢明ではありません。アクセス数が少ない場合、ヒットする可能性は低くなります。このマシンでのテスト中、攻撃を受けることはほとんどなく、マシンが再起動されてもセッション ID は数日間変化しませんでした。テスト中は、ヒット確率を高めるために有効期限の確率値を大きく設定する必要があります。


PHP 構成ファイルの有効期限の確率の値を変更することで、「幸運な」方法でセッションの有効期限を設定できます。もっと良い方法はありますか?

以下に書かれたセッションクラスは、セッションが期限切れにならず、セッションIDが変更されないという問題を完全に解決できます。

[php]
 
 
/**
* 拡張セッションクラス (単純なカプセル化)
*
* @著者スリムボーイ
*
​*/
クラス セッション {
 
    /**
*初期化
​​*/
    静的関数 _init(){
        ini_set('session.auto_start', 0); 
        //セッション::start();  
    }
     
    /**
* セッションを開始します
​​*/
    静的関数 start() {
        セッション開始(); 
    }
 
    /**
* セッションをセットアップします
*
* @param $name セッション名
* @param $value 値
* @param $time タイムアウト時間 (秒)
​​*/
    パブリック静的関数セット($name,$value,$time){
        if(空($time)){
            $time = 1800; //默认值
        }
        $_SESSION[$name] = $value; 
        $_SESSION[$name.'_Expires'] = time() + $time; 
    }
     
    /**
* セッション値を取得します
*
* @param $name セッション名
​​*/
    パブリック静的関数 get($name){
        //检查セッションが否か已过期
        if(isset($_SESSION[$name.'_Expires']) && $_SESSION[$name.'_Expires']>time()){
            $_SESSION[$name] を返します; 
        }その他{
            セッション::clear($name); 
            null を返します。 
        }
    }
     
     
    /**
* セッションドメインを設定します
*
* @param $sessionDomain ドメイン
* @戻り文字列
​​*/
    静的関数 setDomain($sessionDomain = null) {
        $return = ini_get('session.cookie_domain'); 
        if(!empty($sessionDomain)) {
            ini_set('session.cookie_domain', $sessionDomain);//跨域访问Session
        }
        $return を返す; 
    }
     
     
    /**
* セッション値をクリアします
*
* @param $name セッション名
​​*/
    静的関数 Clear($name){
        unset($_SESSION[$name]); 
        unset($_SESSION[$name.'_Expires']); 
    }
     
     
    /**
*セッションをリセットして破棄します
​​*/
    静的関数 destroy(){
        unset($_SESSION); 
        session_destroy(); 
    }
     
     
    /**
     * 取得または設置セッションID
     */
    静的関数セッション ID($id=null){
        セッション ID ($id) を返します。 
    }
 
}
 
セッション::_init(); 


/**
* 拡張セッションクラス (単純なカプセル化)
*
* @著者スリムボーイ
*
​*/
クラスセッション{

/**
*初期化
​*/
 静的関数 _init(){
  ini_set('session.auto_start', 0);
  //セッション::start();
 }
 
    /**
* セッションを開始します
​​*/
    静的関数 start() {
        session_start();
    }

/**
* セッションをセットアップします
*
* @param $name セッション名
* @param $value 値
* @param $time タイムアウト時間 (秒)
​​*/
    パブリック静的関数セット($name,$value,$time){
     if(空($time)){
      $time = 1800; //默认值
     }
     $_SESSION[$name] = $value;
     $_SESSION[$name.'_Expires'] = time() + $time;
    }
   
    /**
* セッション値を取得します
*
* @param $name セッション名
​​*/
    パブリック静的関数 get($name){
     //セッションが否か已过期
     if(isset($_SESSION[$name.'_Expires']) && $_SESSION[$name.'_Expires']>time()){
      $_SESSION[$name] を返します;
     }その他{
      セッション::clear($name);
      null を返す;
     }
    }
   
   
    /**
* セッションドメインを設定します
*
* @param $sessionDomain ドメイン
* @戻り文字列
​​*/
    静的関数 setDomain($sessionDomain = null) {
     $return = ini_get('session.cookie_domain');
     if(!empty($sessionDomain)) {
      ini_set('session.cookie_domain', $sessionDomain);//跨域访问Session
     }
     $return;
を返す     }
   
   
    /**
* セッション値をクリアします
*
* @param $name セッション名
​​*/
    静的関数clear($name){
     unset($_SESSION[$name]);
     unset($_SESSION[$name.'_Expires']);
    }
   
   
    /**
*セッションをリセットして破棄します
​​*/
    静的関数 destroy(){
     unset($_SESSION);
     session_destroy();
    }
   
   
    /**
* セッション ID を取得または設定します
​​*/
    静的関数セッション ID($id=null){
     return session_id($id);
    }

}

セッション::_init();

调の例:


[php]
//設置セッション
Session::set('UserId', $userid, 3600); 

//設置セッション
Session::set('UserId', $userid, 3600);
[php]
//读取セッション
$userId = Session::get('UserId'); 

//读取セッション
$userId = Session::get('UserId');

当然、应该他它办法、欢迎童鞋提成!

 

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/477484.html技術記事 asp.net でセッションを使用し、その後 php でセッションを使用した場合、php でのセッションは asp.net でのセッションに比べて非常に不快に感じるでしょう。 php セッションを使用すると、sess が発生する可能性があります...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。