创建自定义 PHP 会话处理程序?

2022-08-30 19:18:56

现在,我被困在使用PHP的本机会话管理或创建自己的(基于MySQL的)会话系统之间,我对两者都有一些问题。

  1. 除了会话固定和会话劫持之外,使用 PHP 的本机会话处理代码还有哪些其他问题?这两个都有简单的修复,但我不断看到人们编写自己的系统来处理会话,所以我想知道为什么。

  2. 基于MySQL的会话处理程序会比PHP的本机会话更快吗?假设有一个标准(不是“内存”)表。

  3. 使用有什么主要的缺点吗?在大多数情况下,我可以使它符合我的标准(除了命名)。另外,我个人喜欢使用vs的想法,或者某种程度上的东西。session_set_save_handler$_SESSION['blah'] = 'blah'$session->assign('blah', 'blah')

  4. 有什么好的php会话资源,我应该看看吗?我上一次使用会话是在10年前,所以我的知识有点停滞不前。Google和Stackoverflow搜索产生了许多基本的,显然写得很差的教程和示例(在cookie中存储用户名+ md5(密码)然后创建一个会话!),所以我希望这里的某人有一些合法的,更高的资源。

  5. 无论我的选择如何,我都会强制采用仅限cookie的方法。这到底是错的吗?此代码将支持的站点在平均安全环境中具有普通用户。我记得上次使用会话时这是一个很大的问题,但是使用in-url会话的想法让我非常紧张。


答案 1

2)的答案是 - id取决于。让我解释一下:为了使会话处理程序正常运行,您确实应该实现某种类型的锁定和解锁机制。MySQL方便地具有锁定表和取消锁定表的功能。如果不在会话处理程序中实现表锁定,则在基于 ajax 的请求中可能会出现争用条件。相信我,你不想要这些。

阅读这篇详细文章,其中介绍了自定义会话处理程序中的争用条件

好的,如果您像应该的那样将LOCK TABLE和UNLOCK TABLE添加到每个会话调用中,那么您的自定义会话处理程序将变得有点慢。

为了加快速度,您可以做的一件事是使用堆表来存储会话。这意味着数据将仅存储在RAM中,永远不会写入磁盘。这将非常快地工作,但如果服务器出现故障,所有会话数据都将丢失。

如果您同意服务器关闭时会话丢失的可能性,那么您应该改用memcache作为会话处理程序。Memcache已经具有使用php会话处理程序的所有必要功能,只需安装memcache服务器,安装php的memcache扩展,然后添加类似的东西即可.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"

这肯定比默认的基于文件的会话处理程序快得多。

使用MySQL作为会话处理程序的优点是,您可以编写执行其他操作的自定义类,当数据保存到会话时,这是额外的事情。例如,假设您将一个表示 USER 的对象保存到会话中。您可以使用自定义会话处理程序从该对象中提取用户名,用户ID,头像,并将其写入MySQL会话表,并将其写入自己的专用列中,从而可以轻松显示谁在线

如果您在会话处理程序中不需要额外的方法,则没有理由使用MySQL来存储会话数据


答案 2

PHP 应用程序在请求之间丢失会话信息。由于斯坦福大学有多个Web服务器,因此不同的请求可能会被定向到不同的服务器,因此会话信息经常丢失。

斯坦福大学的Web基础设施由多个Web服务器组成,这些服务器彼此不共享会话数据。因此,会话可能会在请求之间丢失。使用MySQL有效地抵消了这个问题,因为所有会话数据都被定向到数据库服务器而不是Web集群。在数据库中存储会话还具有增加隐私和安全性的效果,因为访问数据库需要身份验证。我们建议斯坦福大学所有可以访问MySQL的Web开发人员都使用此方法进行会话处理。

来自 http://www.stanford.edu/dept/its/communications/webservices/wiki/index.php/How_to_use_MySQL-based_sessions

这可能会对您有所帮助。


推荐