首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >创建自定义PHP会话处理程序?

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

Stack Overflow用户
提问于 2011-02-20 22:03:23
回答 4查看 13.9K关注 0票数 22

现在,我在使用PHP的本机会话管理和创建自己的(基于MySQL的)会话系统之间左右为难,我对这两者都有几个问题。

除了会话固定和会话劫持之外,使用的本机会话处理代码还有什么其他的问题吗?

  1. 这两个都很容易修复,但是我一直看到人们编写自己的系统来处理会话,所以我想知道为什么。
  2. 基于MySQL的会话处理程序会比PHP的原生会话快吗?假设有一个标准的(不是“内存”)表。
  3. 使用session_set_save_handler有什么主要的缺点吗?我可以让它在很大程度上符合我的标准(命名除外)。另外,我个人喜欢使用$_SESSION['blah'] = 'blah'$session->assign('blah', 'blah')的想法,或者在某种程度上。
  4. 有没有什么好的php会话资源,我应该看看?我上一次使用sessions是在10年前,所以我的知识有点停滞不前。谷歌和Stackoverflow搜索产生了许多基本的,显然写得很差的教程和例子(将用户名+md5(密码)存储在cookie中,然后创建一个会话!),所以我希望这里有人有一些我选择的合法的,更高层次的cookie,我将强制使用cookie的方法。这在任何方面都是错误的?在一般的安全环境中,此代码将支持的站点具有普通用户。我记得上次我使用会话时,这是一个很大的问题,但是使用in-url会话的想法让我非常紧张。
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-02-20 22:33:03

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

请阅读这篇详细介绍race condition in custom session handler的文章:

好的,那么,如果你像你应该的那样向每个会话调用添加锁表和解锁表,那么你的自定义会话处理程序就会变得有点慢。

可以做的一件事是使用堆表来存储会话,这样做的速度会更快。这意味着数据将只存储在RAM中,而不会写入磁盘。这将以极快的速度工作,但如果服务器宕机,所有会话数据都将丢失。

如果您同意在服务器宕机时丢失会话,那么您应该改用memcache作为会话处理程序。Memcache已经有了所有必要的功能来使用一个php会话处理器,所有你需要做的就是安装memcache服务器,安装php的memcache扩展,然后添加一些类似这样的东西到你的php.ini

代码语言:javascript
复制
[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作为会话处理程序的优点是,您可以编写自定义类来做其他事情,在将数据保存到会话时做额外的事情。例如,假设您将一个表示用户的对象保存到会话中。您可以使用自定义会话处理程序从该对象中提取用户名、用户it、头像,并将它们写入MySQL会话表中各自的专用列中,从而可以轻松地显示的在线

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

票数 9
EN

Stack Overflow用户

发布于 2011-02-20 22:27:38

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

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

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

This可能会对您有所帮助。

票数 2
EN

Stack Overflow用户

发布于 2011-02-20 23:04:48

大多数语言标准库的会话实现只支持基本的键值关联,其中键由客户端提供(即会话ID),值存储在服务器端(即会话存储),然后与客户端的请求相关联。

除此之外的任何东西(特别是安全措施)也超出了键-值关联的基本会话机制,需要添加。特别是因为这些安全措施大多伴随着错误:如何确定某个会话的请求的真实性?按IP地址?通过用户代理标识?还是两者都有?或者根本没有会话身份验证?这始终是开发人员需要处理的安全性和可用性之间的权衡。

但是,如果我需要实现一个会话处理程序,我不会仅仅追求纯粹的速度,而是--取决于需求--还包括可靠性。Memcache可能很快,但如果服务器崩溃,所有会话数据都会丢失。与之相反,数据库更可靠,但与memcache相比,它的速度可能会有所下降。但直到你自己测试和基准测试它,你才会知道。您甚至可以使用两个不同的会话处理程序来处理不同的会话可靠性级别(在memcache中是不可靠的,在MySQL/files中是可靠的)。

但这完全取决于您的需求。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5057466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档