我想从头开始创建一个会话处理程序。我不想使用session_set_save_handler
。我找不到任何地方,我只是不知道从哪里开始。有人可以指出我正确的方向或解释这样做的最佳方法吗?
谢谢! :)
答案 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,因为所有标头都需要先发送。