phpのセッションの有効期限を厳格に設定する方法

4517 ワード

どのようにsessionが30分後に期限切れになることを厳格に制限します!1.クライアントクッキーのlifetimeを30分に設定する.2.sessionの最大生存周期も30分に設定する.3.セッション値ごとにタイムスタンプを加え、プログラム呼び出し時に判断する.
なぜかというと、まずPHPのsessionの基本原理を理解します.
phpのセッション有効期間のデフォルトは1440秒です(24分)、つまりクライアントが24分以上リフレッシュしていないと現在セッションが無効になります.もちろんユーザーがブラウザをオフにするとセッションも終了し、セッションも自然と存在しません!サーバ側にセッションが格納され、クライアントから提供されたセッションIDに基づいてこのユーザーのファイルが得られ、ファイルが読み込まれ、変数の値が取得されることを知っています.SessionIDは、クライアントのCookieまたはHttp 1を用いることができる.1プロトコルのQuery_String(アクセスしたURLの「?次の部分)をサーバに転送し、サーバがSessionのディレクトリを読み込む......Sessionのライフサイクルを制御するには、まずphpを理解する必要があります.Ini Sessionに関する設定(php.iniファイルを開き、[Session]セクション):
1、session.use_Cookies:デフォルト値は「1」で、SessionIDがCookieで渡されることを表し、逆にQuery_を使用します.Stringが伝えます.2、session.name:これがSessionIDに格納されている変数名です.Cookieかもしれません.Queryかもしれません.Stringが渡され、デフォルト値は「PHPSESSID」です.3、session.cookie_Lifetime:これはセッションIDがクライアントCookieに格納されている時間を表し、デフォルトは0であり、ブラウザがセッションIDを閉じると無効になる......そのためセッションは永続的に使用できない!4、session.gc_maxlifetime:これはSessionデータがサーバ側に格納されている時間です.この時間を超えると、Sessionデータは自動的に削除されます.
まだ設定はたくさんありますが、ここではこれについて、Sessionの生存サイクルをどのように設定するかについて説明します.前述したように、サーバはSessionIDを介してSessionのデータを読み取るが、一般的にブラウザから転送されるSessionIDはブラウザが閉じた後には存在しない.では、SessionIDを人為的に設定して保存するだけでいいのではないか.サーバの操作権限を持っている場合は、これを設定するのは非常に簡単で、以下の手順を行う必要があるだけだ.
1、「session.use_cookies」を1に設定し、Cookieを使用してSessionIDを格納するが、デフォルトは1であり、一般的には変更しない.2、「session.cookie_lifetime」を設定する必要がある時間(例えば1時間で3600に設定でき、秒単位で)に変更し、3、「session.gc_maxlifetime」を「session.cookie_lifetime」と同じ時間に設定する.
PHPの文書では、セッションの有効期間を設定パラメータがセッションであることが明確に示されている.gc_maxlifetime.php.iniファイル、またはini_を介してset()関数を使用して、このパラメータを変更します.問題は、複数回のテストを経て、このパラメータを修正することはほとんど役に立たず、session有効期間は24分間のデフォルト値を維持していることです.PHPの動作メカニズムのため、セッション情報をタイミング的にスキャンし、失効したかどうかを判断するdaemonスレッドはありません.有効な要求が発生すると、PHPはグローバル変数sessionに従う.gc_probability/session.gc_divisor(php.iniまたはini_set()関数でも変更できます)の値は、GCを開始するかどうかを決定します.デフォルトではsession.gc_probability=1、session.gc_divisor=100、つまり1%の可能性でGCを開始します.GCの作業は、すべてのsession情報をスキャンし、現在の時間からsessionの最終修正時間を減算することです(modified date)は、session.gc_maxlifetimeパラメータと比較して、生存時間がgc_maxlifetimeを超えた場合、そのsessionを削除します.ここまでは、すべて正常に動作しています.では、なぜgc_maxlifetimeが無効になったのでしょうか.デフォルトでは、session情報はテキストファイルとしてシステムの一時ファイルディレクトリに保存されます.Linuxでは、このパスは通常tmpであり、Windowsでは通常C:WindowsTempである.サーバに複数のPHPアプリケーションがある場合、独自のセッションファイルが同じディレクトリに保存されます.同様に、これらのPHPアプリケーションも一定の確率でGCを起動し、すべてのセッションファイルをスキャンします.
問題は、GCが稼働している間は、異なるサイトのセッションを区別しないことです.例えば、サイトAのgc_maxlifetimeが2時間に設定され、サイトBのgc_maxlifetimeはデフォルトの24分に設定されています.サイトBのGCが起動すると、共通の一時ファイルディレクトリがスキャンされ、サイトAまたはBからのセッションファイルがすべて削除されます.これにより、サイトAのgc_maxlifetime設定は虚構です.問題の所在を見つけて、解決するのは簡単です.セッションを変更します.save_pathパラメータ、またはsession_を使用save_path()関数は、sessionを保存するディレクトリを専用のディレクトリに指し、gc_maxlifetimeパラメータは正常に動作しています.
もう一つの問題はgc_maxlifetimeはセッションの生存の最短時間しか保証できず,この時間を超えるとセッション情報が直ちに削除されるわけではない.GCは確率的に起動しているので、ある長い間起動されていないかもしれませんが、大量のセッションはgc_を超えています.maxlifetime以降も有効です.この問題を解決する一つの方法はsession.gc_probability/session.gc_divisorの確率が向上し、100%といえばこの問題を徹底的に解決しますが、パフォーマンスに深刻な影響を及ぼすことは明らかです.もう一つの方法は自分
php実装のみを使用してセッションクラスを作成し、セッション書き込み時に期限切れ時間も書き込みます.読み取り時には、有効期限によって有効期限が切れたかどうかを判断します.
class Session{  
      
        /** 
         *   session 
         * @param String $name   session name 
         * @param Mixed  $data   session data 
         * @param Int    $expire     ( ) 
         */  
        public static function set($name, $data, $expire=600){  
            $session_data = array();  
            $session_data['data'] = $data;  
            $session_data['expire'] = time()+$expire;  
            $_SESSION[$name] = $session_data;  
        }  
      
        /** 
         *   session 
         * @param  String $name  session name 
         * @return Mixed 
         */  
        public static function get($name){  
            if(isset($_SESSION[$name])){  
                if($_SESSION[$name]['expire']>time()){  
                    return $_SESSION[$name]['data'];  
                }else{  
                    self::clear($name);  
                }  
            }  
            return false;  
        }  
      
        /** 
         *   session 
         * @param  String  $name  session name 
         */  
        private static function clear($name){  
            unset($_SESSION[$name]);  
        }  
      
    }  
    demo.php  
      
    session_start();  
      
    $data = '123456';  
    session::set('test', $data, 10);  
    echo session::get('test'); //    ,    
    sleep(10);  
    echo session::get('test'); //