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吗?

您可以使用 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 或您想要的任何其他形式中设置。

【讨论】:

以上是关于PHP 会话的最佳库 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在php中临时保存数据的最佳方法[关闭]

Grails:在用户会话期间存储数据的最佳方法[关闭]

适用于 Android 的最佳 json rpc 2.0 库 [关闭]

PHP 中的会话超时:最佳实践

创建 whois 查找的最佳方法是啥? [关闭]

在 PHP 中从 AWS S3 中的文件创建 zip 的最佳方法? [关闭]