我刚刚想通了,我真的可以 储存的物体在$_SESSION 我觉得很酷因为当我跳跃到另一个页面上,我还有我的对象。现在在我开始使用这种方法我想找出如果它真的是这样一个好主意,或者如果存在 潜在的陷阱 参与。

我知道如果我有一个单一的进入点我不需要这么做但是我没有所以我没有一个单一的入境点和我真的很喜欢让我的对象,因为我没有失去我的国家这样。(现在我也读那我应该程序的无国籍网站但我不了解这一概念。)

所以 在短短的:那是正确的储存对象在本届会议是否有任何问题?


编辑:

临时摘要:通过现在我明白了,这可能是 更好地重建 的对象,即使这涉及到查询的数据库。

进一步的答案也许可以 详细阐述的那方面 多一点!

有帮助吗?

解决方案

我知道这个话题已经过时了,但是这个问题不断出现,并没有让我满意:

无论是在$ _SESSION中保存对象,还是根据隐藏在表单字段中的数据重建整个布料,或者每次都从数据库重新查询它们,都使用状态。 HTTP是无状态的(或多或少;但请参阅GET与PUT)但几乎所有人都关心Web应用程序需要在某处维护状态。表现得好像把国家推入角落和缝隙相当于某种理论上的胜利是错误的。国家是国家。如果你使用状态,你将失去无国籍所带来的各种技术优势。除非事先知道你应该失去睡眠,否则这不是失眠的原因。

我特别对“双重打击”所获得的祝福感到沮丧。汉克盖伊提出的论点。 OP是否构建了分布式负载均衡的电子商务系统?我的猜测是否定的;并且我将进一步假定序列化他的$ User类,或者其他什么,不会削弱他的服务器无法修复。我的建议:使用对您的应用程序敏感的技术。 $ _SESSION中的对象很好,受常识预防措施的限制。如果您的应用突然变成与服务流量相媲美的亚马逊,您将需要重新适应。这就是生活。

其他提示

只要在调用session_start()时,就已经遇到了类声明/定义,或者已经安装的自动加载器可以找到它。否则它将无法从会话存储中反序列化对象。

HTTP是无国籍协议的一个原因。会议焊状态到HTTP。作为一个法则,避免使用会议的状态。

更新:没有概念的一届会议在HTTP水平;服务器提供这给客户的一个独特的ID,并告诉客户重新提交它对所有请求。然后服务器使用这一标识作为一个关键成一个大hashtable届会议的对象。每当的服务器获取的请求,它看起来会议的信息的其hashtable会议对象的基础上ID客户提交的请求。所有这些额外的工作是一个双重打击在可扩展性(一个很大的原因HTTP是无国籍).

  • 重打击的一种:它减少了的工作一个单一的服务器可以做的。
  • 打击有两种:这使得它很难规模,因为现在你不能只是路线的请求的任何旧服务器的-他们并不都具有同样的会议。你可以将所有请求给予session ID到相同的服务器。这是不容易的,这是一个单一故障点(不适用于该系统作为一个整体,但是对于大量的用户)。或者,你可以分享本会议的存储的所有服务器群集中的,但现在你有更多的复杂程度:网络附加储器,一个独立的会议服务,等等。

鉴于这一切,更多的信息放在该届会议上,大影响性能(作为Vinko点)。还为Vinko指出的,如果你的对象不可串行,会议将胡作非为。因此,作为一个法则,避免将超过绝对必要在本届会议。

@Vinko可以通常的工作周围具有服务器的储存状态,由嵌入的数据你是跟踪在响应你发送回和具有客户重新提交,例如,将数据发送下一个隐藏的输入。如果你 真的 需要服务器侧跟踪的国家,它也许应该在你的衬数据存储库。

(Vinko补充说:PHP可以使用一个数据库,用于存储届会议的信息,并具有客户重新提交的数据每个时间可能会解决潜在的可扩展性问题,但是打开大可能的安全问题必须注意到现在客户的控制的所有您的状态)

  • 对象而不能列化的(或者含有不可序列化的成员)不会出来的$_SESSION正如你所期望的
  • 大会把一个服务器负担(序列化和反序列化兆的国家,每次为昂贵)

其他比我见过的任何问题。

根据我的经验,对于比具有某些属性的StdClass更复杂的东西,它通常是不值得的。在给定会话存储的标识符的情况下,反序列化的成本一直不仅仅是从数据库中重新创建。这看起来很酷,但(一如既往),分析是关键。

我建议除非你绝对需要,否则不要使用州。如果可以在不使用会话的情况下重建对象,请执行此操作。 在Web应用程序中使用状态会使应用程序构建更复杂,对于每个请求,您都必须查看用户所处的状态。当然,有时您无法避免使用会话(例如:用户必须在会话期间保持登录状态网络应用程序)。 最后我建议保持会话对象尽可能小,因为它会影响性能以序列化和反序列化大对象。

您必须记住,资源类型(例如数据库连接或文件指针)不会在页面加载之间持续存在,您需要无形地重新创建它们。

还要考虑会话的大小,具体取决于它的存储方式,可能存在大小限制或延迟问题。

升级软件库时我会提出 - 我们升级了我们的软件,旧版本的对象与V1软件的类名称会话,新软件试图构建会话中的对象时崩溃了 - 因为V2软件不再使用那些相同的类,所以它找不到它们。我们必须输入一些修复代码来检测会话对象,如果找到则删除会话,重新加载页面。最初想到的最大的痛苦是在第一次报告时重新创建这个错误(太熟悉了,“好吧,它适用于我”)因为它只影响最近进出旧系统的人 - 但是,我们确实在发布之前找到了它,因为我们所有的用户肯定会在他们的会话中使用旧的会话变量并且可能会崩溃所有人,这将是一个可怕的发布:)

无论如何,正如你在修正案中所建议的那样,我也认为重新创建这个对象会更好。所以也许只是存储id然后在每个请求中从数据库中拉出对象,更好/更安全。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top