2

我想从头开始创建一个会话处理程序。我不想使用session_set_save_handler. 我在任何地方都找不到任何东西,我只是不知道从哪里开始。有人能指出我正确的方向或解释最好的方法吗?

谢谢!:)

4

3 回答 3

1

尝试构建自己的会话机制时,需要注意的事项很少。

您可以做的第一件事是编写一个 PHP 会话包装器。将包装 PHP 会话功能的类。因此,当您想使用 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 会话,而不必使用 PHP 函数。但请注意,您无论如何都在使用 PHP 函数,只是在使用此类时看不到它。这样做可以帮助您深入了解 PHP 会话的工作原理。

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

您将编写自己的对象,该对象将为您提供读取、写入、编辑、删除...会话数组的方法。该数组必须在保存到 cookie 之前进行序列化。一旦会话保存在 cookie 中,您可以使用您编写的方法将它们取出、编辑或删除它们等。这样做时,请注意安全性,因为用户可以查看他们的 cookie。您将不得不加密会话值。

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

最好的方法是编写会话接口,每个会话类都会实现。这样你就可以使用你的 Session 类,而不关心会话存储在哪里。

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

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

于 2012-11-08T16:21:30.107 回答
0

调用会话时我会做什么

//开始会话并设置变量

session_start();

$_SESSION['登录']='是';

$_SESSION['someinfo']=$var;

//调用时

session_start();

$var= $_SESSION['someinfo'];

我希望这有帮助

-克里斯

于 2012-11-08T16:08:47.540 回答
0

如果您使用加密 cookie ,则不需要使用 PHP 的会话处理。基本上,标准会话将数据存储在服务器上(内存缓存、文件或数据库),并且数据的 ID/密钥被放置在给用户代理的 cookie 中。

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

如果数据不够重要而无法加密,您也可以仅对cookie 内容进行 HMAC 签名,以防止人们即使看到原始内容也无法更改它。

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

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

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

于 2012-11-08T16:25:07.560 回答