2011-09-17 44 views
4

我在与整个cookie的域/ CDN的事情板,我了解是在发送的cookie的请求www.yourdomain.com,同时建立像CDN一个单独的域。 yourdomain.com保留不必要的Cookie被发送可以帮助性能。PHP会话,cookie的域和性能

我很好奇的是,如果使用PHP的本地会话会对性能产生负面影响,如果是这样,如何?我知道会话密钥跟踪在一个小的cookie中,所以看起来很好。

系统提示我问这个问题,因为过去我写过我的网络应用程序,并在$_SESSION变量中存储了用户的活动数据,首选项和身份验证信息。但是,我注意到一些流行的Web应用程序,如Wordpress,根本不使用$_SESSION。但会话易于使用且看起来相当安全,特别是如果将它与跟踪用户代理/ IP更改结合以防止会话劫持。那么为什么Wordpress和其他Web应用程序不使用PHP的会话?我是否也应该停止使用会话?

而且,还让我澄清,我的确意识到服务器必须加载会话数据来处理页面请求,但是这不是我问这里。我的问题是关于它是如何/如何影响网络性能的,特别是关于发送/接收报头的问题。例如,使用会话是否阻止网站上的页面或图像从浏览器的缓存中提供? PHPSESID Cookie是唯一正在发送的附加标题吗?这些东西。

+0

我没有使用Wordpress的经验。为了我的好奇心,有人可以确认它确实不会使用会话,甚至不能保持登录的基本目的吗?我可以看到使用db存储来代替扩展会话var存储。 –

+0

Wordpress不使用会话。我知道为什么,它有历史的原因。但我很好奇哪些其他流行的Web应用程序不是那么好?你有更多的例子吗? – hakre

+0

Michael - Worpress绝对不会使用会话,除非您使用已启动会话的插件。 @hakre - 你能分享历史原因吗?我主要使用WP,但Expression Engine和Code Ignitor不使用PHP的会话。 – cwd

回答

3

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

  • 当两个请求访问同一个会议上,一个请求将战胜其他和其他请求需要等到第一个请求已完成。由文件锁定控制的竞争条件。

使用Cookie存储会话数据(WordPress的,笨),比赛条件是相同的,但锁是不是内在的,但浏览器可以做的cookie管理范围内的锁定。

使用Cookie有,你不能存储大量数据,而且数据得到与每个请求和响应通过下行。这很可能引发安全问题。窃取cookie并获得数据。如果它被加密,攻击者可以尝试解密它以获取存储在其中的数据。

Wordpress的历史原因是该平台从未使用PHP会话。根项目始于2000年左右,在2002年和2004年得到了很大的推动。由于会话处理仅适用于PHP 4,而且PHP 3在那个时候更受欢迎。

后来,当$_SESSION可用时,该应用程序的主要设计已经完成,它的工作。接下来,在2004/2005年,wordpress决定启动一个商业多博客托管服务。这创造了跨服务器和cookie +数据库扩展应用程序的需求,与使用$_SESSION实现相比,数据库对于会话/用户处理来说更容易。事实上,这很容易,只是工作,所以从来没有需要改变它。

对于Codeigniter,我不能说那么多。我知道它默认存储cookie中的所有会话信息。所以会话只是Cookie的另一个名称。可以选择它可以加密,但这需要配置。据说IIRC已经这样做了,因为“大多数用户不需要会话”。对于需要的用户,有一个数据库后端(需要额外的配置),以便用户可以在其应用程序中透明地从cookie更改为数据库存储。还有一种新的实施方式,可以让您更换任何您喜欢的商店,例如本地PHP会话也是如此。这是通过所谓的驱动程序完成的。

但是,这并不意味着你不能根据现在的$_SESSION来实现。你可以用你喜欢的任何东西来替换商店(甚至是饼干:)),而且它的PHP实现应该封装在一个好的程序设计中。

这样做可以实现一个商店,您可以更好地控制锁定(例如数据库),并且可以在不支持粘性会话的负载平衡基础结构中的服务器上运行。

Wordpress是一个很好的例子,它自己实现的会话处理完全不可知论的任何PHP提供。这意味着车轮已被重新发明。从今天起,我不会将他们的设计称为明确创新,因此它充分满足了特定环境中的一项非常具体的需求,只有在了解项目根源的情况下,您才能了解这些需求。

Codeigniter可能会提前一小步(在界面上),因为它为会话提供某种(不稳定)的接口,并且可以用您喜欢的任何实现来代替它。这对新开发人员来说更好,但它也是重新发明轮子的原因,因为PHP已经开箱即用了。

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

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

做到这一点,再加上商店加配置的抽象(例如全部在一个会话依赖容器中),无论出于何种原因,您都应该能够在任意数量的服务器上扩展和维护应用程序。如果你认为这对你有用,那么你的实现就可以使用cookies。但是,如果您需要,您将能够切换到基于数据库的会话 - 无需重新编写应用程序的大部分内容。

+0

所以看起来内置'$ _SESSION'的主要问题确实是可扩展性,而不是网络负载。凉。另外,WordPress的历史很有趣。感谢分享。 – cwd

+0

不,$ _SESSION主要关注的是全局状态。 '$ _SESSION'可以很好地扩展,[您可以更改存储实现](http://www.php.net/manual/en/session.customhandler.php),以及手册:[Session Handling](http ://www.php.net/manual/en/book.session.php) – hakre

1

我不是100%的信心是这样的话,但一个理由,以避免在PHP中内置的$ _SESSION机制是,如果你想部署一个高可用性的网络场方案Web应用程序。

因为在PHP中默认的会话行为是存储会话对象的过程中,在内存中,这使得它很难(如果不是不可能的),有来自同一用户的多台服务器处理请求。如果您想要在Web场环境中部署您的Web应用程序,那么您只有这样才能让您的应用程序处理平衡负载的大量PHP Web服务器。

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

正如我在开始时说,我不是100%肯定,如果PHP支持,而不是在进程默认配置会话状态提供者是一个数据库,或会话状态服务器。

+0

在我的工作中,我们有一个负载平衡的环境(称为DYNOFARM),其中五个或六个服务器共享请求。我不会说我们是真正的高负荷,但我一直使用会议,并从未遇到过问题。 –

+0

@Milky Dinescu - 我看到你在说什么,它是有道理的:避免php本地会话的一个原因是因为它阻止跨多个服务器扩展,而无需使用某些特殊工具。我记得以前读过这个,但已经忘记了。谢谢你提醒我。 – cwd