现在我在使用PHP的本机会话管理或创建我自己的(基于MySQL的)会话系统之间陷入困境,我对这两者都有一些问题.
除了会话固定和会话劫持之外,使用PHP的本机会话处理代码还有什么其他问题?这两个都有简单的修复,但我一直看到人们编写自己的系统来处理会话,所以我想知道为什么.
基于MySQL的会话处理程序会比PHP的本机会话更快吗?假设一个标准(非'内存')表.
使用有任何重大缺点session_set_save_handler吗?我可以使它在大多数情况下符合我的标准(除了命名).另外,我个人喜欢使用$_SESSION['blah'] = 'blah'vs $session->assign('blah', 'blah')或者某种程度的想法.
有什么好的PHP会话资源,我应该看一看?我最后一次与会议合作是在10年前,所以我的知识有点停滞不前.谷歌和Stackoverflow搜索产生了很多基本的,明显写得不好的教程和示例(在cookie中存储用户名+ md5(密码)然后创建一个会话!),所以我希望这里有人有一些合法的,更高级的资源.
无论我的选择如何,我都会强制采用纯cookie方式.这有什么不对吗?在平均安全环境中,此代码将支持的站点具有普通用户.我记得上次使用会话时这是一个很大的问题,但使用in-url会话的想法让我非常紧张.
2)的答案是 - id取决于.让我解释一下:为了使会话处理程序正常运行,你真的应该实现某种类型的锁定和解锁机制.MySQL方便地具有锁定表和unclock表的功能.如果您没有在会话处理程序中实现表锁定,那么您可能会面临基于ajax的请求中的竞争条件.相信我,你不要那些.
阅读这篇解释自定义会话处理程序中竞争条件的详细文章:
好吧,如果你像每个会话调用一样添加LOCK TABLE和UNLOCK TABLE,那么你的自定义会话处理程序会慢一点.
你可以做的一件事就是使用HEAP表来存储会话.这意味着数据将仅存储在RAM中,并且永远不会写入磁盘.这将快速工作,但如果服务器出现故障,所有会话数据都将丢失.
如果你确定在服务器关闭时会话丢失的可能性,那么你应该使用memcache作为会话处理程序.Memcache已经拥有了使用php会话处理程序所需的所有功能,所有你需要安装memcache服务器,安装php的memcache扩展,然后添加这样的东西给你php.ini
[Session]
; Handler used to store/retrieve data.
; http://php.net/session.save-handler
;session.save_handler = files
session.save_handler = memcache
session.save_path="tcp://127.0.0.1:11215?persistent=1"
Run Code Online (Sandbox Code Playgroud)
这将比基于默认文件的会话处理程序快得多
使用MySQL作为会话处理程序的优点是,您可以编写执行其他操作的自定义类,将数据保存到会话时的额外操作.例如,假设您将表示USER的对象保存到会话中.您可以使用自定义会话处理程序从该OBJECT中提取用户名,用户ID,头像并将它们写入MySQL SESSION表中,并将其写入自己的专用列,从而可以轻松显示Who's在线
如果在会话处理程序中不需要额外的方法,则没有理由使用MySQL来存储会话数据