首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP会话、无cookieless域和性能

PHP会话、无cookieless域和性能
EN

Stack Overflow用户
提问于 2011-09-18 04:55:09
回答 2查看 1.6K关注 0票数 4

我支持整个无cookies域名/ CDN的事情,我理解如何将请求的cookies发送到www.yourdomain.com,同时设置一个单独的域,如cdn.yourdomain.com,以防止不必要的cookies被发送,这有助于提高性能。

我好奇的是,使用PHP的原生会话是否会对性能产生负面影响,如果会,又是如何影响性能的?我知道会话密钥保存在cookie中,这个cookie很小,所以这看起来很好。

我被提示问这个问题,因为在过去,我已经编写了我的web应用程序,并在$_SESSION变量中存储了大量用户的活动数据、首选项和身份验证信息。然而,我注意到一些流行的web应用程序,比如Wordpress,根本不使用$_SESSION。但是会话很容易使用,而且看起来相当安全,特别是当您将其与跟踪用户代理/ ip更改相结合以防止会话劫持时。那么为什么Wordpress和其他web应用不使用php的会话呢?我是否也应该停止使用会话?

另外,让我澄清一下,我确实意识到服务器必须加载会话数据才能处理页面请求,但这不是我在这里问的问题。我的问题是它是否/如何影响网络性能,特别是关于发送/接收的报头。例如,使用会话是否会阻止从浏览器的缓存中提供站点上的页面或图像?PHPSESID cookie是要发送的唯一附加报头吗?这类事情。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-18 15:04:01

$_SESSION的标准存储是每个会话一个文件的文件系统。这是有代价的:

  • 当两个请求访问同一个会话时,一个请求将赢得另一个请求,另一个请求需要等待,直到第一个请求完成。由文件锁定控制的争用条件。

使用cookie存储会话数据(Wordpress、Codeigniter),竞争条件是相同的,但锁定并不是固有的,但浏览器可能会在cookie管理中进行锁定。

使用cookies的缺点是您不能存储那么多数据,并且每个请求和响应都会传递这些数据。这也可能引发安全问题。偷了cookie,你就有了数据。如果它是加密的,攻击者可以尝试解密它以获取存储在其中的数据。

Wordpress的历史原因是该平台从未使用过PHP会话。root项目开始于2000年左右,它在2002和2004年得到了很大的关注。因为会话处理只在PHP4中可用,而PHP3在当时更流行。

后来,当$_SESSION可用时,应用程序的主要设计已经完成,并且工作正常。紧接着,在2004/2005年,wordpress决定启动一项商业多博客托管服务。这就产生了在服务器上扩展应用程序的需求,与使用$_SESSION实现相比,cookies+database看起来更容易处理会话/用户。事实上,这很简单,而且只需要工作,所以根本不需要改变它。

对于Codeigniter,我不能说太多。我知道默认情况下,它将所有会话信息存储在一个cookie中。因此会话只是cookie的另一个名称。也可以选择加密,但这需要配置。IIRC说这样做是因为“大多数用户不需要会话”。对于那些需要的人,有一个数据库后端(需要额外的配置),以便用户可以在他们的应用程序中透明地从cookie更改到数据库存储。还有一个新的实现,允许你更改到任何你喜欢的存储,例如原生PHP会话。这是通过所谓的驱动程序来完成的。

然而,这并不意味着你现在不能基于$_SESSION实现同样的目标。您可以将存储替换为您喜欢的任何东西(甚至cookies :),并且它的PHP实现无论如何都应该封装在一个好的程序设计中。

这样,你就可以实现一个你可以更好地控制锁定的存储(例如数据库),它可以在负载平衡的基础设施中跨服务器工作,而这个基础设施不支持粘性会话。

Wordpress是一个很好的例子,它实现了会话处理,完全不知道PHP提供了什么。这意味着轮子已经被重新发明了。从今天的观点来看,我不会把他们的设计称为明确的创新,所以它完全满足了一个非常特定的环境中的一个非常具体的需求,只有在你了解项目的根源的情况下才能理解。

Codeigniter可能领先了一小步(在接口意义上),因为它为会话提供了某种(不稳定的)接口,并且可以用你喜欢的任何实现来取代它。这对新开发人员来说要好得多,但它也在某种程度上重新发明了轮子,因为PHP已经开箱即用了。

在应用程序设计中,您可以做的最好的事情是使实现独立于系统需求,从而使会话数据的存储机制独立于程序流的其余部分。PHP提供了一个非常直接的接口、$_SESSION数组和会话配置。

由于$_SESSION是一个超全局数组,您可能希望阻止应用程序直接访问它,因为这会引入全局状态。因此,在一个好的设计中,你应该有一个到它的接口,以便能够从超级全局中完全抽象出来。

做到这一点,再加上存储和配置的抽象(例如,所有在一个会话依赖容器中),你应该能够扩展和维护你的应用程序,无论出于什么原因,你想要多少服务器都行。然后,您的实现可以只使用cookie,如果您认为它适合您的话。然而,你将能够切换到基于数据库的会话,以防你需要它--而不需要重写应用程序的大部分。

票数 3
EN

Stack Overflow用户

发布于 2011-09-18 06:03:09

我不能100%确定这是真的,但是避免使用PHP内置的$_SESSION机制的一个原因是如果你想把你的web应用程序部署在一个高可用性的web场场景中。

因为PHP中的默认会话行为是将会话对象存储在进程中、存储在内存中,所以让多个服务器处理来自同一用户的请求非常困难(如果不是不可能的话)。只有当您想要在web场环境中部署您的web应用程序时,您才会有此功能,在该环境中,您有许多PHP web服务器处理您的应用程序的请求,以平衡负载。

因此,虽然进程中的会话状态通常比基于数据库的解决方案快得多,但当您需要处理大量请求和服务于web场环境所使用的容量时,后者是有利的。

正如我在开头所说的,我不能百分之百确定PHP是否支持将会话状态提供程序配置为数据库或会话状态服务器,而不是进程中的默认设置。

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

https://stackoverflow.com/questions/7457719

复制
相关文章

相似问题

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