【问题标题】:Supplant $_SESSION variable替换 $_SESSION 变量
【发布时间】:2013-11-23 15:14:30
【问题描述】:

我想知道这是否可以取代 $_SESSION。我想创建一个使用 $ _SESSION 在我的数据库中记录我的会话的系统,如下所示:

$_SESSION['identifier'] = 'value'; // Perform insert/update on my DBMS
echo $_SESSION['identifier']; // Perform select on my DBMS

如果我的课堂会话不可用或被站点管理员禁用,我希望我的系统完全透明且正常运行。

感谢您的帮助。

【问题讨论】:

    标签: php session mariadb php-5.4


    【解决方案1】:

    这是一个示例代码:

    $sess = new sess();
    
    session_start();
    $_SESSION =& $sess;
    
    //test
    $_SESSION['value'] = 'ccc';
    
    some_test_func();
    function some_test_func() {
    //test again in different scope
    $_SESSION['anotehr_value'] = 444;
    }
    
    
    class sess implements \Iterator, \ArrayAccess, \Countable
    {
    
        protected $session_data;
    
        public final function rewind() {
            reset($this->session_data);
        }
    
        public final function current() {
            $var = current($this->session_data);
            return $var;
        }
    
        public final function key() {
            $var = key($this->session_data);
            return $var;
        }
    
        public final function next() {
            $var = next($this->session_data);
            return $var;
        }
    
        public final function valid() {
            $var = $this->current() !== false;
            return $var;
        }
    
        public final function offsetExists($offset) {
            //Database query comes here (SELECT)
            print 'SELECT var_value FROM session_data WHERE var_name = :offset AND session_id = :session_id';
            $session_id = session_id();
            return isset($this->session_data[$offset]);
        }
    
        public final function offsetGet($offset) {
            //Database query comes here (SELECT)
            print 'SELECT var_value FROM session_data WHERE var_name = :offset AND session_id = :session_id';
            $session_id = session_id();
            return $this->session_data[$offset];
        }
    
        public final function offsetSet($offset,$value) {
            //Database query comes here (REPLACE by primary key)
            print 'REPLACE INTO session_data (session_id, var_name, var_value) VALUES (:session_id, :offset, :value)';
            $session_id = session_id();
            $this->session_data[$offset] = $value;
        }
    
        public final function offsetUnset($offset) {
            //Database query comes here (DELETE)
            print 'DELETE FROM session_data WHERE var_name = :offset AND session_id = :session_id';
            $session_id = session_id();
            unset($this->session_data[$offset]);
        }
    
        public final function count() {
            return count($this->session_data);
        }
    }
    

    您可以通过添加重载来扩展它。 您可以使用 $session_data 作为缓存副本或使用所有查询(如果可以的话,应该避免)。在一般情况下,我建议不要对每个会话更改进行查询(会有很多数据库写入)。也许您这样做是为了避免覆盖会话,但为此您可以使用锁定机制来序列化具有相同 session_id 的所有请求。 我会避免这个的另一个原因是因为这条线: $_SESSION =& $sess; 在未来的某些 PHP 版本中可能无法使用。 (我在 php 5.3.20 上对此进行了测试)。

    另一个问题是,将来其他人可能只是使用您的代码,甚至不怀疑 $_SESSION 在后台做什么......您应该明确记录这种行为。

    附:或者您可能只是想将会话存储在数据库中。那你应该看看http://php.net/manual/en/function.session-set-save-handler.php 在这里,您只需执行两个查询 - 会话读取和会话写入。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-19
      • 2020-06-17
      • 1970-01-01
      • 2014-07-28
      • 1970-01-01
      • 2012-03-27
      • 2021-01-01
      • 2014-07-01
      相关资源
      最近更新 更多