19

我已经使用 CodeIgniter 系统有一段时间了 - 但它有它的缺点。我很感激它教给我的东西,但现在我需要一个用于新的非 codeigniter 项目的库,所以我正在四处寻找关于哪些库有正确的东西和哪些没有的想法。我可能不得不从几个图书馆中获取我需要的一切。

我只是看了一下Kohana PHP 会话库,我喜欢它如何返回到使用 $_SESSION 超全局而不是强制更改为 $this->session 以进行数据访问的原生 PHP 方式。

无论如何,我想知道是否还有其他好的会话库我可能会搞砸。除了功能上的 CRUD 之外,会话中还必须处理很多事情。

  • 支持基于非 cookie 的会话传递(即 Facebook 或 Flash 上传器)
  • “Flash 数据”仅持续到下一页加载,然后被自动删除。
  • 与 $_SESSION 或 $this->session 一起使用,这样程序员就不必更改现有代码。
  • 支持设置新的会话 id(即 session_id('new id')),以防您想在页面中途更改 id。
  • 在页面请求结束时保存所有数据,而不是每次添加或删除数据时(节省额外的数据库查询)。
  • 支持使用文件、cookie 或数据库进行存储。(或者memcached会很好)
  • 在会话劫持的情况下尝试拒绝访问。(IP、用户代理或指纹

我刚刚花了一些时间研究 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
}
4

4 回答 4

5

你看过了Zend_Session吗?

  • 您可以使用 PHP 设置通过 URL 传递会话标识符
  • 您可以按时间或按跃点(请求)使某些会话变量过期
  • 迁移到其他应用程序不会那么容易而且我认为$_SESSION在你使用的时候乱七八糟的不是很好Zend_Session
  • Zend_Session有一种基于适配器的方法来保存会话数据。包含一个用于 DB 的保存处理程序,但其架构允许传入自定义处理程序。
  • Zend_Session支持验证器检查会话的有效性。在这里,我们也有一个开放式架构,允许您传入自定义对象进行验证。
  • 您可以锁定会话,也就是将其设为只读
  • 您可以防止同一会话命名空间的多个实例的实例化
  • 此外,还有更多需要发现的内容,Zend_Session例如重新生成会话 ID、发出 remember-me-cookies、撤销 remember-me-cookies 等等。
于 2009-07-11T20:28:00.473 回答
3

好的,在挖掘了自定义的、非基于 $_SESSION 的 codeigniter 库、两个 Kohana 和 Zend 库(使用 $_SESSION)以及来自其他项目的其他几个会话库之后,我相信我构建了我的问题的答案。满足我上面列出的所有内容的东西(闪存数据除外)。

如果有人想在构建自己的库时使用或阅读它,这里是代码。我留下了很多评论,彻底解释了整个事情,并希望得到一些反馈。它支持令牌、基于闪存的上传器、cookie、会话重新生成每 5 分钟(或您设置的任何内容)并删除旧会话,并支持将会话存储在任何数据库、文件系统、memchache 或您想要的任何其他形式中放。

于 2009-07-15T21:37:28.137 回答
3

看看Zebra_Session,PHP 默认会话处理函数的包装器,使用 MySQL 进行存储

  • 作为 PHP 的默认会话处理函数的包装器,但不是将会话数据存储在平面文件中,而是将它们存储在 MySQL 数据库中,从而提供更好的安全性和更好的性能

  • 它是 PHP 的默认会话处理程序的直接替代品:PHP 会话的使用方式与使用该库之前的方式相同;您无需更改任何现有代码!

  • 实现行锁,确保在有多个并发AJAX请求的场景下正确处理数据

  • 只有一个文件

  • 成熟、高度优化、不断发展

  • 非常好的文档

于 2012-07-29T10:06:15.410 回答
3

您可以在 CI 中使用它:EchoSession

于 2009-07-13T14:22:54.600 回答