2011-07-28 47 views
6

我用笨到期我的應用程序笨會議頻繁

我的問題是什麼會話過期,即使用戶在網站上的活動。

這些會話設置..我使用DB會話

$config['sess_cookie_name']  = 'ci_session'; 
$config['sess_expiration']  = 7200; 
$config['sess_encrypt_cookie'] = FALSE; 
$config['sess_use_database'] = TRUE; 
$config['sess_table_name']  = 'edu_sessions'; 
$config['sess_match_ip']  = FALSE; 
$config['sess_match_useragent'] = TRUE; 
$config['sess_time_to_update'] = 300; 

這方面的任何解決方案。

幫助我,我必須解決它

這裏是笨forum link

+0

是你肯定會話正確地保存到數據庫? –

+0

我不知道,但是當我在會話中使用更多數據時,如果啓用了dbsession選項,那麼只有會話正在工作,否則它不能正常工作 – nani1216

回答

13

我已經與CI會話隨機到期的問題。你有加載會話庫的AJAX或動態資源嗎?如果是這樣,想象一下這個場景:

我提交了一個ajax請求(它傳遞了我的CI會話id和cookie),並且它返回結果,但是我也提交了一些其他請求(加載動態圖像,另一個AJAX請求等),緊跟在第一個請求之後。第一個請求可能觸發300秒「是時候更新」事件,並傳回一個新的cookie,但額外的請求是發送舊的會話ID,對吧?

因此,CodeIgniter說:「嘿,你不能這樣做」,並創建一個新的會話,使兩個cookie無效,我的瀏覽器現在不知道該怎麼辦。

這裏有一個論壇的鏈接我張貼了一段時間後是進入更多細節: http://codeigniter.com/forums/viewthread/172415/

+0

謝謝landons。我的應用程序有許多動態的Ajax調用,就像你解釋的一樣。如果你有這個解決方案,請讓我知道。這是我申請中的一個嚴重問題。謝謝 – nani1216

+0

我會擴展Session類,並編寫自己的sess_destroy函數,該函數檢查INPUT :: is_ajax_request()函數以防止ajax請求的正常會話到期。請記住,每次調用sess_destroy()函數時,sess_read函數都將返回FALSE,因此您也需要覆蓋它。想要一個工作的例子? – landons

+0

雅,給我一個工作的例子,以便我可以快速做到這一點。謝謝 – nani1216

3

正如在第一個答案提到的,在會議庫中的競爭條件,而且以最新被有所減輕CodeIgniter版本,包括'develop'分支。這實現了對會話輪換的isAjax檢查,但它並沒有真正解決潛在的問題。

2

你確定會話被銷燬?我認爲它只是沒有按照假設進行更新,而是在每個頁面請求上創建一個新的。 (普通笨的設置問題)

這裏是我的建議:

仔細檢查您的application/config/config.php文件,以確保會議域的部分看起來像,如果你的主機網站上的主目錄:

$config['cookie_prefix'] = ""; 
$config['cookie_domain'] = "yourdomain.com"; 
$config['cookie_path'] = "var/sessions/"; 
$config['cookie_secure'] = FALSE; 

和喜歡,如果你主辦的網站上的一個子目錄:

$config['cookie_prefix'] = ""; 
$config['cookie_domain'] = "yourdomain.com"; 
$config['cookie_path'] = "siteSubDirectory/var/sessions/"; 
$config['cookie_secure'] = FALSE; 

並確保2個目錄可通過修改其權限爲755左右來寫入,我強烈建議您啓用數據庫會話,這樣會更安全,並通過檢查會話表來幫助您找出真正的問題。祝你好運:)

2

我會爲這個問題添加一個解決方法。 如果一個Ajax調用,就這樣不更新會話 加入這個文件到庫擴展了會話類文件夾:

class MY_Session extends CI_Session { 

    // -------------------------------------------------------------------- 

    /** 
    * sess_update() 
    * 
    * @access public 
    * @return void 
    */ 
    public function sess_update() 
    { 
     $CI =& get_instance(); 

     if (! $CI->input->is_ajax_request()) 
     { 
      parent::sess_update(); 
     } 
    } 

} 
1

只要改變ci_sessions表編碼在MyISAM: ALTER TABLE ci_sessions ENGINE = MyISAM;

+1

這就是我需要的,你知道爲什麼不爲InnoDB工作嗎?謝謝! – Jawaad