【问题标题】:Best library for PHP Sessions [closed]PHP 会话的最佳库 [关闭]
【发布时间】: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。有时我一直在想这件事。感谢您详细说明

标签: php codeigniter session kohana


【解决方案1】:

你看过Zend_Session吗?

  • 您可以使用 PHP 设置通过 URL 传递会话标识符
  • 您可以按时间或按跃点(请求)使某些会话变量过期
  • 迁移到其他应用程序不会那么容易而且我认为当你使用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 或您想要的任何其他形式中设置。

    【讨论】:

      猜你喜欢
      • 2012-01-15
      • 2013-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-16
      • 2015-09-11
      • 1970-01-01
      • 2011-03-04
      相关资源
      最近更新 更多