【问题标题】:Why am I losing my session data from memcached?为什么我会从 memcached 中丢失会话数据?
【发布时间】:2011-04-27 17:38:16
【问题描述】:

我一直在整理 Codeigniter 会话库的扩展。

完整的“包”可以在github找到。

我遇到的问题是它似乎正在将数据保存到内存缓存中,但是当它运行以下方法时(CI 每隔一段时间更新一次会话数据 - 默认为 5 分钟),它似乎“丢失”了数据。我很确定它会在添加新项目然后删除旧项目的地方发生。

    function sess_update() {
        // We only update the session every five minutes by default
        if (($this->userdata['last_activity'] + $this->sess_time_to_update) >= $this->now) {
            log_message('info','not enough time before update');
            return;
        }
        log_message('info','defo need to update session');

        // Save the old session id so we know which record to
        // update in the database if we need it
        $old_sessid = $this->userdata['session_id'];
        $new_sessid = '';
        while (strlen($new_sessid) < 32) {
            $new_sessid .= mt_rand(0, mt_getrandmax());
        }

        // To make the session ID even more secure we'll combine it with the user's IP
        $new_sessid .= $this->CI->input->ip_address();

        // Turn it into a hash
        $new_sessid = md5(uniqid($new_sessid, TRUE));
        log_message('info','session id generated');
        // Update the session data in the session data array
        $this->userdata['session_id'] = $new_sessid;
        $this->userdata['last_activity'] = $this->now;

        // _set_cookie() will handle this for us if we aren't using database sessions
        // by pushing all userdata to the cookie.
        $cookie_data = NULL;

        $cookie_data = array();
        foreach (array('session_id', 'ip_address', 'user_agent', 'last_activity') as $val) {
            $cookie_data[$val] = $this->userdata[$val];
        }

        switch ($this->session_storage) {
            case 'database':
                // Update the session ID and last_activity field in the DB if needed
                // set cookie explicitly to only have our session data
                $this->CI->db->query($this->CI->db->update_string($this->sess_table_name, array('last_activity' => $this->now, 'session_id' => $new_sessid), array('session_id' => $old_sessid)));
                break;
            case 'memcached':                
                // Add item with new session_id and data to memcached
                // then delete old memcache item
                $this->memcache->add('user_session_data' . $new_sessid, $this->userdata, false, $this->sess_expiration);
                log_message('info', 'new session added');
                $this->memcache->delete('user_session_data' . $old_sessid, 0);
                log_message('info', 'old session deleted');                
                break;
        }



        // Write the cookie
        $this->_set_cookie($cookie_data);
    }

有人知道我哪里出错了吗?

【问题讨论】:

    标签: php session codeigniter memcached


    【解决方案1】:

    如果您想将 memcache 用于会话,最好的方法是直接在 php.ini 中设置它并利用本机功能:

    session.save_handler = memcache 
    session.save_path = "tcp://localhost:11211"
    

    【讨论】:

    • 我宁愿使用 CI 的会话处理(不使用 PHP 的原生会话处理)
    猜你喜欢
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-17
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多