11

専門家、

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

私の場合、そのセッション テーブルには期限切れのセッションが 3 つあり、同じユーザーに対してアクティブなセッションが 1 つあります。マニュアルには次のように記載されています。

うーん、データベース セッション テーブル内の「古い」セッションがクリアされるのはいつですか、それとも何か不足していますか?

ありがとう!

4

1 に答える 1

15

セッション クラスの関連するソース コードは次のとおりです。

/**
 * 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 クラスのコンストラクターの 1 か所 (ほぼ最後の行) で呼び出されるため、通常の状況では要求ごとに 1 回呼び出されます。

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

これらの古いエントリは重要でも害でもないことに注意してください。クリーンアップは、データベース テーブルが古くて役に立たないレコードで過負荷にならないようにするためだけに行われます。

于 2012-11-20T01:00:40.077 に答える