【问题标题】:Does PHP session conflict with Share-Nothing-Architecture?PHP 会话是否与 Share-Nothing-Architecture 冲突?
【发布时间】:2010-03-26 02:55:13
【问题描述】:

当我第一次遇到 PHP 时,我对 Sharing-Nothing-Architecture 的想法感到惊讶。我曾经在一个项目中,其可扩展性因在不同 HTTP 请求之间共享数据而受到影响。

但是,当我继续我的 PHP 学习时。我发现 PHP 有会话。这看起来与不分享任何东西的想法相冲突。

那么,PHP 会话只是为了制作 ASP/ASP.NET/J2EE 的对应技术而发明的?高度可扩展的网站应该使用 PHP 会话吗?

【问题讨论】:

    标签: php scalability


    【解决方案1】:

    默认的 PHP 模型基于每个用户锁定会话。这意味着如果用户 A 正在加载页面 1 和 2,而用户 B 正在加载页面 3,则唯一会发生的延迟是页面 2 必须等到页面 1 完成——页面 3 仍将独立于页面 1 加载和 2 因为没有为单独的用户共享任何内容;仅在给定会话内。

    所以它基本上是一个对半解决方案,最终效果还不错 - 大多数用户不会同时加载多个页面;因此会话锁定延迟通常很低。就不同用户的请求而言,仍然没有共享任何内容。

    【讨论】:

    • 否 - 某些会话处理程序可能会这样做(我特别考虑 Microsoft 上基于文件的会话处理),即使那样,如果您在这样的平台上,您始终可以执行显式 session_comit()
    • @symcbean,你的意思是,在基于 Windows 文件的会话处理中,所有 HTTP 请求都会针对不同的会话通过一个锁吗?我试了一下。使用 Firefox 和 IE 访问我的脚本(在我的问题中)。它们是两个不同的会话,它们不会相互阻止。我不确定我对您的 cmets 的理解是否正确。
    • 我也不确定 symcbean 指的是什么。
    • @Morgan - 没有 - 一个会话 -> 一个数据文件 -> 一个锁 - 但是同一个服务器端会话可以与多个浏览器会话相关联 - 甚至对于单个浏览器窗口也可以多个并发请求
    【解决方案2】:

    PHP 允许您编写自己的会话处理程序 - 因此您可以使用默认挂钩构建自己的语义 - 或者,如果您愿意,您可以使用内置功能来生成会话 ID 并处理浏览器端然后编写自己的代码来存储/获取会话数据(例如,如果您只希望登录页面而不是其他页面在处理过程中锁定会话数据,那么使用标准挂钩虽然并非不可能,但有点棘手)。

    我对用于会话处理的 Microsoft 体系结构了解不多,无法对此发表评论,但 PHP 会话处理的方式以及实际存储在会话中的内容与 J2EE 相比存在巨大差异。

    在您的大多数页面中不使用会话将使应用程序的执行速度更快,并且可能更容易扩展 - 但您可以说应用程序使用的任何数据。

    C.

    【讨论】:

    • 嗯~,我原来对PHP的Sharing-Nothing-Architecture的理解可能不太对。在 Web 应用程序中,您将始终共享一些东西。会话只是使共享更加容易和易于管理。如果会话数据存储在外部高速存储中,例如内存缓存和速度。它仍然是可扩展的。无论如何,我相信可扩展性的理念是消除瓶颈。也就是减少共享依赖。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-23
    • 1970-01-01
    相关资源
    最近更新 更多