我想从头开始创建一个会话处理程序。我不想使用session_set_save_handler
. 我在任何地方都找不到任何东西,我只是不知道从哪里开始。有人能指出我正确的方向或解释最好的方法吗?
谢谢!:)
尝试构建自己的会话机制时,需要注意的事项很少。
您可以做的第一件事是编写一个 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 机制没有任何问题。
调用会话时我会做什么
//开始会话并设置变量
session_start();
$_SESSION['登录']='是';
$_SESSION['someinfo']=$var;
//调用时
session_start();
$var= $_SESSION['someinfo'];
我希望这有帮助
-克里斯
如果您使用加密 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,因为所有标头都需要先发送。