2012-05-16 100 views
0

我使用Codeigniter的本機會話類來存儲用戶信息,但我有一個嚴重的問題。看起來,當用戶閒置約半個小時並將他註銷時,會話超時。Codeigniter本機會話的問題

我的配置文件看起來像這樣:

$config['sess_cookie_name'] = 'cisession'; 
$config['sess_expiration'] = 60*60*24*30*12*2; 
$config['sess_expire_on_close'] = FALSE; 
$config['sess_encrypt_cookie'] = FALSE; 
$config['sess_use_database'] = FALSE; 
$config['sess_table_name'] = 'ci_sessions'; 
$config['sess_match_ip'] = FALSE; 
$config['sess_match_useragent'] = TRUE; 
$config['sess_time_to_update'] = 7200; 

,因爲我已經在配置文件中設置它,它在兩年內到期,當用戶註銷時在瀏覽器中的PHPSESSID不被破壞和。

我不知道本機會話類的常見問題是什麼,因爲每個人似乎都很滿意,所以有人可以解決這個問題最可能導致什麼問題?

編輯:對於那些誰不熟悉CodeIgniter的本地會話類這裏是鏈接 http://codeigniter.com/wiki/Native_session

回答

-1

PHP的會話1440秒(24分鐘)後過期。

http://php.net/manual/en/session.configuration.php

+0

CodeIgniter不使用PHP會話。它有一個自定義的基於cookie的實現。 – Narf

+0

@Gurrewe是的我知道,但配置文件中的行$ config ['sess_expiration'] = 60 * 60 * 24 * 30 * 12 * 2;應該覆蓋該規則並將其設置爲會話在兩年內到期。 – madeye

+0

@Narf我不使用codeigniter的默認會話類,而是我自動加載的本地會話,其行爲與php會話類似,不使用cookie存儲信息 – madeye

0

我也用笨的原生類。也許你沒有正確配置它。這是我從他那裏得到的代碼。 https://github.com/EllisLab/CodeIgniter/wiki

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 



    class CI_Session { 

    var $session_id_ttl; // session id time to live (TTL) in seconds 
    var $flash_key = 'flash'; // prefix for "flash" variables (eg. flash:new:message) 

    function __construct() 
    { 
     log_message('debug', "Native_session Class Initialized"); 
     $this->object =& get_instance(); 
     $this->_sess_run(); 
    } 

    /** 
    * Regenerates session id 
    */ 
    function regenerate_id() 
    { 
     // copy old session data, including its id 
     $old_session_id = session_id(); 
     $old_session_data = $_SESSION; 

     // regenerate session id and store it 
     session_regenerate_id(); 
     $new_session_id = session_id(); 

     // switch to the old session and destroy its storage 
     session_id($old_session_id); 
     session_destroy(); 

     // switch back to the new session id and send the cookie 
     session_id($new_session_id); 
     session_start(); 

     // restore the old session data into the new session 
     $_SESSION = $old_session_data; 

     // update the session creation time 
     $_SESSION['regenerated'] = time(); 

     // session_write_close() patch based on this thread 
     // http://www.codeigniter.com/forums/viewthread/1624/ 
     // there is a question mark ?? as to side affects 

     // end the current session and store session data. 
     session_write_close(); 
    } 

    /** 
    * Destroys the session and erases session storage 
    */ 
    function destroy() 
    { 
     unset($_SESSION); 
     if (isset($_COOKIE[session_name()])) 
     { 
       setcookie(session_name(), '', time()-42000, '/'); 
     } 
     session_destroy(); 
    } 

    /** 
    * Reads given session attribute value 
    */  
    function userdata($item) 
    { 
     if($item == 'session_id'){ //added for backward-compatibility 
      return session_id(); 
     }else{ 
      return (! isset($_SESSION[$item])) ? false : $_SESSION[$item]; 
     } 
    } 

    /** 
    * Sets session attributes to the given values 
    */ 
    function set_userdata($newdata = array(), $newval = '') 
    { 
     if (is_string($newdata)) 
     { 
      $newdata = array($newdata => $newval); 
     } 

     if (count($newdata) > 0) 
     { 
      foreach ($newdata as $key => $val) 
      { 
       $_SESSION[$key] = $val; 
      } 
     } 
    } 

    /** 
    * Erases given session attributes 
    */ 
    function unset_userdata($newdata = array()) 
    { 
     if (is_string($newdata)) 
     { 
      $newdata = array($newdata => ''); 
     } 

     if (count($newdata) > 0) 
     { 
      foreach ($newdata as $key => $val) 
      { 
       unset($_SESSION[$key]); 
      } 
     }   
    } 

    /** 
    * Starts up the session system for current request 
    */ 
    function _sess_run() 
    { 
     session_start(); 

     $session_id_ttl = $this->object->config->item('sess_expiration'); 

     if (is_numeric($session_id_ttl)) 
     { 
      if ($session_id_ttl > 0) 
      { 
       $this->session_id_ttl = $this->object->config->item('sess_expiration'); 
      } 
      else 
      { 
       $this->session_id_ttl = (60*60*24*365*2); 
      } 
     } 

     // check if session id needs regeneration 
     if ($this->_session_id_expired()) 
     { 
      // regenerate session id (session data stays the 
      // same, but old session storage is destroyed) 
      $this->regenerate_id(); 
     } 

     // delete old flashdata (from last request) 
     $this->_flashdata_sweep(); 

     // mark all new flashdata as old (data will be deleted before next request) 
     $this->_flashdata_mark(); 
    } 

    /** 
    * Checks if session has expired 
    */ 
    function _session_id_expired() 
    { 
     if (!isset($_SESSION['regenerated'])) 
     { 
      $_SESSION['regenerated'] = time(); 
      return false; 
     } 

     $expiry_time = time() - $this->session_id_ttl; 

     if ($_SESSION['regenerated'] <= $expiry_time) 
     { 
      return true; 
     } 

     return false; 
    } 

    /** 
    * Sets "flash" data which will be available only in next request (then it will 
    * be deleted from session). You can use it to implement "Save succeeded" messages 
    * after redirect. 
    */ 
    function set_flashdata($key, $value) 
    { 
     $flash_key = $this->flash_key.':new:'.$key; 
     $this->set_userdata($flash_key, $value); 
    } 

    /** 
    * Keeps existing "flash" data available to next request. 
    */ 
    function keep_flashdata($key) 
    { 
     $old_flash_key = $this->flash_key.':old:'.$key; 
     $value = $this->userdata($old_flash_key); 

     $new_flash_key = $this->flash_key.':new:'.$key; 
     $this->set_userdata($new_flash_key, $value); 
    } 

    /** 
    * Returns "flash" data for the given key. 
    */ 
    function flashdata($key) 
    { 
     $flash_key = $this->flash_key.':old:'.$key; 
     return $this->userdata($flash_key); 
    } 

    /** 
    * PRIVATE: Internal method - marks "flash" session attributes as 'old' 
    */ 
    function _flashdata_mark() 
    { 
     foreach ($_SESSION as $name => $value) 
     { 
      $parts = explode(':new:', $name); 
      if (is_array($parts) && count($parts) == 2) 
      { 
       $new_name = $this->flash_key.':old:'.$parts[1]; 
       $this->set_userdata($new_name, $value); 
       $this->unset_userdata($name); 
      } 
     } 
    } 

    /** 
    * PRIVATE: Internal method - removes "flash" session marked as 'old' 
    */ 
    function _flashdata_sweep() 
    { 
     foreach ($_SESSION as $name => $value) 
     { 
      $parts = explode(':old:', $name); 
      if (is_array($parts) && count($parts) == 2 && $parts[0] == $this->flash_key) 
      { 
       $this->unset_userdata($name); 
      } 
     } 
    } 

}