从头开始的会话处理

时间:2012-11-08 15:55:55

标签: php session

我想从头开始创建一个会话处理程序。我不想使用session_set_save_handler。我找不到任何地方,我只是不知道从哪里开始。有人可以指出我正确的方向或解释这样做的最佳方法吗?

谢谢! :)

3 个答案:

答案 0 :(得分:1)

尝试构建自己的会话机制时,有几点需要注意。

您可以做的第一件事就是编写一个PHP Session包装器。将包含PHP Session功能的类。因此,当您想要使用Sessions时,您可以实例化会话类并使用会话执行所需的操作。你可以这样做:

class Session
    {
        /**
         * Starts new or resumes existing session
         * 
         * @access  public
         * @return  bool
         */

        public function start()
        {
            if(session_start()) {
                return true;
            }
            return false;
        }

        /**
         * End existing session, destroy, unset and delete session cookie
         * 
         * @access  public
         * @return  void
         */

        public function end()
        {
            if($this->status != true) {
                $this->start();
            }

            session_destroy();
            session_unset();
            setcookie(session_name(), null, 0, "/");
        }

        /**
         * Set new session item
         * 
         * @access  public
         * @param   mixed
         * @param   mixed
         * @return  mixed
         */

        public function set($key, $value)
        {           
            return $_SESSION[$key] = $value;
        }

        /**
         * Checks if session key is already set
         * 
         * @access  public
         * @param   mixed  - session key
         * @return  bool 
         */

        public function has($key)
        {
            if(isset($_SESSION[$key])) {
                return true;
            }

            return false;
        }   

        /**
         * Get session item
         * 
         * @access  public
         * @param   mixed
         * @return  mixed
         */

        public function get($key)
        {
            if(!isset($_SESSION[$key])) {
                return false;
            }

            return $_SESSION[$key];         
        }
    }

然后您可以像这样使用此会话类:

$session = new Session();
$session->start();
$session->set('id', 5);
echo $session->get('id);

我喜欢这个,因为我可以像对象一样使用PHP Sessions,而不必使用PHP函数。 但请注意,无论如何使用PHP函数,在使用此类时,您只是看不到它。这样做可以帮助您深入理解PHP会话的工作方式。

如果您决定咬紧牙关并编写自己的会话机制,则需要注意的事项很少。您需要决定的第一件事是存储会话信息的位置? 您可以将它们保存在数据库,文件系统,cookie等中...... 默认情况下,PHP在文件系统上保存会话。编写自己的会话机制的最简单方法是将会话保存到cookie中。如果您使用Codeigniter会话,Codeigniter默认执行此操作。

您可以编写自己的对象,可以使用方法来读取,编写,编辑,删除...会话数组。在保存到cookie之前,必须序列化该数组。将会话保存在cookie中后,您可以使用您编写的方法将其删除,编辑或删除等。这样做时,请注意安全性,因为用户可以查看其cookie。你必须加密会话值。

然后,如果您决定将会话保存到数据库中,您可以使用相同的方法,但这次将会话保存到数据库中而不是cookie。

最好的方法是编写Session Interface,每个会话类都会实现。这样您就可以使用Session类,而不关心会话存储的位置。

如果您不明白我现在在说什么,那么只需构建自己的会话包装器,这可以帮助您了解有关会话的更多信息。并为您提供了使用OOP处理会话的好方法。完成之后,您可以使用该API编写会话接口,并在每个Session类中实现该接口,并编写自己的逻辑,以便在何处以及在何处保存会话数据。

还有一件事,PHP Sessions机制没有任何问题。

答案 1 :(得分:0)

在调用会话

时我做了什么

//开始会话并设置var的

在session_start();

$ _ SESSION [ '登录'] = '是';

$ _ SESSION [ 'someinfo'] = $变种;

//在致电时

在session_start();

$ var = $ _SESSION ['someinfo'];

我希望这有帮助

-kris

答案 2 :(得分:0)

如果使用encrypted cookies,则无需使用PHP的会话处理。基本上,标准会话将数据存储在服务器(内存缓存,文件或数据库)上,数据的ID /密钥放在提供给用户代理的cookie中。

加密的cookie只是将数据存储在用户代理的cookie中,并完全放弃ID /密钥。这可以减少服务器负载,因为存储已卸载到用户。

如果数据不够重要,无法加密,您还可以HMAC sign the cookie内容阻止人们更改内容,即使他们可以看到原始内容。

您可能想尝试使用加密Cookie的简单PHP Kit库。

$_SESSION = \Kit\Cookie::get('session');
...do stuff...
\Kit\Cookie::set('session', $_SESSION);

只需确保在向用户发送任何输出之前保存cookie,因为所有标头都需要先发送。