|  | 
 
| 本帖最后由 小白TO大白 于 2012-8-30 14:57 编辑 
 之前用CI的session类来保持数据,更改了config.php里面的设置时间为一个星期。然后今天突然想设置一个保持时间为1分钟的变量,但发现没有提供参数。就去看了下源码
 
 
 PHP复制代码 复制代码/** 然我我自己在后面加了一个expire参数来保持时间         * Add or change data in the "userdata" array*
 * @access        public
 * @param        mixed
 * @param        string
 * @return        void
 */
        function
  set_userdata($newdata = array(), $newval = '', $expire = 0)
        {
                if (is_string($newdata))
                {
                        $newdata = array($newdata => $newval);
                }
 
                if (count($newdata) > 0)
                {
                        foreach ($newdata as $key => $val)
                        {
                                $this->userdata[$key] = $val;
                        }
                }
 
                $this->sess_write($expire);
        }
 然后再来看sess_write,因为不存数据库,所以直接调用_set_cookie(),把我们的参数expire也带上
 
 PHP复制代码 复制代码/**         * Write the session data*
 * @access        public
 * @return        void
 */
 function sess_write($expire = 0)
 {
 // Are we saving custom data to the DB?  If not, all we do is update the cookie
 if ($this->sess_use_database === FALSE)
 {
 $this->_set_cookie($expire);
 return;
 }
 
 最后看到_set_cookie函数
 
 PHP复制代码 复制代码/**         * Write the session cookie*
 * @access        public
 * @return        void
 */
        function
  _set_cookie($expire = 0, $cookie_data = NULL)
        {
                if (is_null($cookie_data))
                {
                        $cookie_data = $this->userdata;
                }
 
                // Serialize the userdata for the cookie
                $cookie_data = $this-> _serialize($cookie_data);
 
                if ($this->sess_encrypt_cookie == TRUE)
                {
                        $cookie_data = $this->CI->encrypt->encode($cookie_data);
                }
                else
                {
                        // if encryption is not used, we provide an md5 hash to prevent userside tampering
                        $cookie_data = $cookie_data.md5($cookie_data.$this->encryption_key);
                }
                
                if($expire)
               {
                         $expire = $expire + time();
               }
               else
               {
                         $expire = ($this->sess_expire_on_close === TRUE)  ? 0 : $this->sess_expiration + time();
               }
                // Set the cookie
                setcookie(
                                        $this->sess_cookie_name,
                                        $cookie_data,
                                        $expire,
                                        $this->cookie_path,
                                        $this->cookie_domain,
                                        $this->cookie_secure
                                );
        }
 其实CI的session是存的cookie数据,然后用一个键名包含所有数据,最后取出来,再解析分成多个你存储的数据。查看浏览器cookie中只有一个值就可以看出。在这里,每次设置cookie用的都是同一个sess_cookie_name,所以如果你再次设置一个新的时间为1分钟的话,1分钟之后,之前设置为1周的也就同时消失了。
 我也是新手,不知道说的对不对?希望大家指正
 
 | 
 |