2012-11-20 15 views
11

エキスパート期限切れのcodeigniterセッションはどのようにクリーンアップされますか?

アプリケーションがデータベーステーブルにセッションを保存するように設定されている場合、Codeigniterでセッションがクリーンアップされる方法を理解しようとしています。

私の場合、セッションテーブルには3つのセッションがあり、同じユーザーに対しては1つのアクティブなセッションがあります。マニュアルには が記載されています。注:Sessionクラスにはガベージコレクションが組み込まれているため、有効期限が切れたセッションが消去されるため、独自のルーチンを作成する必要はありません。

まあ、dbセッションテーブルの私の「古い」セッションがクリアされているか、何か不足していますか?

ありがとうございました!ここで

+0

2.1.3(user_data)以前はクリアされていませんでした。手動でクリアする必要があったので、セッションにuser_dataが含まれていましたか?もしそうなら、$ this-> session-> unset_userdata(array(...));を使います。それ以外の場合は、$ this-> session-> sess_destroy()は – Philip

+0

で十分です。フィリップ氏に感謝しますが、Codeigniterが自動的にセッションをクリーンアップする方法と、期限切れ後に調べる方法を知りたかったのです。 – dutchman711

答えて

14

は、Sessionクラスの関連するソースコードです:

/** 
* Garbage collection 
* 
* This deletes expired session rows from database 
* if the probability percentage is met 
* 
* @access public 
* @return void 
*/ 
function _sess_gc() 
{ 
    if ($this->sess_use_database != TRUE) 
    { 
     return; 
    } 

    srand(time()); 
    if ((rand() % 100) < $this->gc_probability) 
    { 
     $expire = $this->now - $this->sess_expiration; 

     $this->CI->db->where("last_activity < {$expire}"); 
     $this->CI->db->delete($this->sess_table_name); 

     log_message('debug', 'Session garbage collection performed.'); 
    } 
} 

この機能は、通常の状況下ではとても一回のリクエストにつき、Sessionクラス(ほとんど最後の行)のコンストラクタで、一つの場所に呼ばれています。

$this->gc_probabilityは、クラスの先頭に5にハードコードされており、変更できないようです。私は確信していませんが、これは、ガベージコレクションが実行される時間(無作為に)の5%がセッションDBテーブルから古いエントリをクリアすることを意味します。

これらの古いエントリは重要ではないことに注意してください。クリーンアップは、データベーステーブルが古い無駄なレコードでオーバーロードされないようにのみ行われます。

+0

洞察力がありがとう! :) – dutchman711

関連する問題