背景:
我是基于PHP5.3构建的新项目的起点。我刚刚开始研究以最初让我将会话保存到数据库的方式处理会话的方法。我将所有会话管理分离到一个单独的库中,以便于透明地迁移到 memcached ,单独的会话数据库服务器,或者那时最好的解决方案。
我对于什么是一个好方法感到困惑 - 网上有很多不同的想法如何处理因PHP版本而异的会话,我读的越多,我就越困惑。
问题:
以下是我认为最合适的选项。我应该使用哪一个?为什么?是否还有其他替代方案需要考虑?
选项1:
使用session_set_save_handler
并为每个会话事件创建自定义函数,以充分利用PHP的本机(内置)会话处理,但仍将会话保存到数据库。会话将写成$_SESSION['identifier'] = 'value';
。
选项2:
构建一个完整的会话类,它与PHP的会话无关,只是作为与数据库中sessions
表交谈的任何数据库模型。会话将写成$this->sessions->write('identifier', 'value');
。
答案 0 :(得分:8)
$_SESSION
超全局在PHP中实际上是一个非常好的功能。
根据您的软件解决方案的最终结果,第三方用户将更习惯于使用您的自定义会话处理程序在后台执行魔术来写入和读取此超全局。
通过Suhosin提供了很好的安全增强功能,在为自己开发会话存储空间时,您无需“担心”。
答案 1 :(得分:2)
我建议你采取后一种方式,但是有一个很酷的转折。
创建一个Session
类,然后使用适配器模式使用DatabaseSession
和CookieSession
具体类扩展它。
在我的诚实意见中,覆盖session_save_handler
似乎太过分了。
通过包装类路由所有与会话相关的交互,可以在项目变得越来越大时为您提供更大的灵活性。
这样的事情:
interface SessionAdaptor {
function write($key, $data, $timeout);
function read($key);
function key_exists($key);
}
class Session {
private $adaptor;
function __construct(SessionAdaptor $adaptor) {
$this->adaptor = $adaptor;
}
//here we go:
function write($key, $data, $timeout) {
return $this->adaptor->write($key, $data, $timeout);
}
function read($key) {
return $this->adaptor->read($key);
}
function key_exists($key) {
return $this->adaptor->key_exists($key);
}
}
class DatabaseSession implements SessionAdaptor {
//...
}
class CookieSession implements SessionAdaptor {
//...
}
用法:
$database_session = new Session(new DatabaseSession());