PHP 会话的最佳库 [关闭]
Posted
技术标签:
【中文标题】PHP 会话的最佳库 [关闭]【英文标题】:Best library for PHP Sessions [closed] 【发布时间】:2010-11-09 23:58:59 【问题描述】:我已经使用 CodeIgniter 系统有一段时间了 - 但it has 它是short comings。我很感激它教给我的东西,但现在我需要一个用于新的非 codeigniter 项目的库,所以我正在四处寻找关于哪些库有正确的东西和哪些没有的想法。我可能不得不从几个图书馆中获取我需要的一切。
我刚刚查看了Kohana php session 库,我喜欢它如何返回使用 $_SESSION 超全局而不是强制更改 $this->session 以进行数据访问的原生 PHP 方式。
无论如何,我想知道是否还有其他好的会话库我可能会搞砸。除了功能上的 CRUD 之外,会话中还必须处理很多事情。
支持基于非 cookie 的会话传递(即 Facebook 或 Flash 上传器) “Flash 数据”仅持续到下一页加载,然后被自动删除。 与 $_SESSION 或 $this->session 一起使用,这样程序员就不必更改现有代码。 支持设置新的会话 ID(即 session_id('new id')),以防您想在页面中途更改 ID。 在页面请求结束时保存所有数据,而不是每次添加或删除数据时保存(节省额外的数据库查询)。 支持使用文件、cookie 或数据库进行存储。 (或者 memcached 会很好) 在会话劫持的情况下尝试拒绝访问。 (IP、用户代理或fingerprint)我刚刚花了一些时间研究 CodeIgniter 和 Kohana 会话库的逻辑,我想出了以下关于每个页面如何开始和结束会话的信息。
/**************
** Kohana Sessions
**************/
If not native file storage
session_set_save_handler to the storage type (DB, cache, cookie...)
set the session_name() so php knows what cookie value to check
start session
/****** Saving ******/
session_write_close() which calls the given handler
/**************
** CI Sessions
**************/
Try to read_session() ->
session = Get cookie (if using cookies will also contain data)
if(database)
session .= pull data from database
checks if valid...
$this->userdata = session data
else
create a new one
/****** Saving ******/
session data is serialized either way
if(cookie)
save cookie with serialized data and params like "last_activity"
if(database)
save serialized data in db and session in cookie
【问题讨论】:
+1。有时我一直在想这件事。感谢您详细说明 【参考方案1】:你看过Zend_Session
吗?
Zend_Session
时与$_SESSION
混在一起不是很好
Zend_Session
有一种基于适配器的方法来保存会话数据。包含用于 DB 的 save-handler,但其架构允许传入自定义处理程序。
Zend_Session
支持验证器检查会话的有效性。在这里,我们也有一个开放式架构,允许您传入自定义对象进行验证。
您可以锁定会话,也就是将其设为只读
您可以防止同一会话命名空间的多个实例的实例化
此外,Zend_Session
还可以发现更多内容,例如重新生成会话 ID、发出 remember-me-cookies、撤销 remember-me-cookies 等等。
【讨论】:
感谢您的提醒。 Zend 通常涵盖了他们所有的基础,所以它是很好的代码检查。但是,仅用于会话处理程序的 10 个文件 - 我想我会提取一些更好的部分,这样我就不会自己编写任何东西。 Zend Session 类似乎更接近于 Kohana 类,它依赖于 $_SESSION 超全局和设置会话处理程序——这绝对是正确的方法。【参考方案2】:您可以在 CI 中使用它:EchoSession。
【讨论】:
谢谢,但就像我说的那样,这不适用于 codeigniter 项目。实际上,我在查看 Zend_Session 和许多其他会话库时已经下载了该库。通过审查每个代码,一种模式开始出现,即会话处理的“最佳实践”是什么。【参考方案3】:看看Zebra_Session, a wrapper for PHP’s default session handling functions, using mysql for storage
充当 PHP 的默认会话处理函数的包装器,但不是将会话数据存储在平面文件中,而是将它们存储在 MySQL 数据库中,从而提供更好的安全性和更好的性能
它是 PHP 的默认会话处理程序的直接替代品:PHP 会话的使用方式与使用该库之前的方式相同;您无需更改任何现有代码!
实现行锁,确保在有多个并发 AJAX 请求的场景中正确处理数据
只有一个文件
成熟、高度优化、不断发展
very good documentation
【讨论】:
【参考方案4】:好的,在研究了自定义的、非基于 $_SESSION 的 codeigniter 库、两个 Kohana 和 Zend 库(使用 $_SESSION)以及来自其他项目的其他几个会话库之后,我相信我构建了我的答案问题。满足我上面列出的所有条件的东西(闪存数据除外)。
Here is the code 如果有人想在构建自己的库时使用或阅读它。我留下了很多 cmets 彻底解释了整个事情,并希望对此有一些反馈。它支持令牌、基于闪存的上传器、cookie、会话重新生成每 5 分钟(或您设置的任何内容)并删除旧会话,并支持将会话存储在任何数据库、文件系统、memchache 或您想要的任何其他形式中设置。
【讨论】:
以上是关于PHP 会话的最佳库 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章