HTTP 请求之间具有持久状态的模型

Posted

技术标签:

【中文标题】HTTP 请求之间具有持久状态的模型【英文标题】:Models with persistent state between HTTP requests 【发布时间】:2011-02-20 04:22:38 【问题描述】:

我想创建一个具有在 HTTP 请求之间持续存在的模型的 Web 应用程序。据我了解,像 php 这样的语言将每个 HTTP 请求视为一个全新的连接,除了一些全局变量,如 SESSION;所以每次用户更改页面时,我的所有 PHP 类都会再次加载到内存中(每个 AJAX 请求也会这样做) - 每次都需要我从数据库构建。

我是不是弄错了,还是我想让一个圆适合一个正方形? Memcached 似乎是一个很好的解决方案,可以在页面请求之间将我的模型保存在内存中,但它仍然需要加载缓存。 PHP CLI 似乎很有希望,但在对其进行了更多研究之后,它似乎比它的价值更麻烦。有什么建议吗?

【问题讨论】:

http 是无状态协议,php 与否。会话是添加状态的常用方法,但我不确定你真正问的是什么 这些答案帮助我找到了我正在寻找的信息。特别是this article on java stateful web apps 完全覆盖了它。 Web sockets 似乎解决了这个问题。 Albatross for Python 是另一个用于有状态 Web 应用程序的框架。 与Java、Python、Ruby的区别在于应用程序本身有状态;他们不会像 PHP 一样在每次请求后拆除。如果您认为 Web 套接字是一个不错的选择,Node.js 可能真的是您正在寻找的金票。 @coreyward 感谢所有信息,这正是我想知道的。只是为了进一步完善它here,它讨论了 Django 如何使用数据库或 memcached 维护状态,就像 PHP 一样。 【参考方案1】:

您应该避免在 Web 应用程序中要求持久状态; HTTP 是无状态的,您需要围绕它设计业务逻辑。此外,PHP 不是非常安全的内存泄漏,因为它不打算充当守护程序或长时间运行。您也不应该在 PHP 变量中维护信息数据库。您可以在 memcache 中缓存昂贵的查询结果,并以非常短的延迟检索它们。

您可以序列化您的模型,将其存储在会话(或内存缓存)中,并在下一个请求时对其进行反序列化,以便将相关变量保持在请求之间的范围内。如果您分享更多有关您的应用程序细节的信息,也许我们可以帮助您找出处理此问题的最佳方法。

【讨论】:

这是一个游戏,用户在浏览器中更新对象的位置,并可以与其他玩家实时互动。对于我计划使用 PHP CLI 和套接字的实时用户间通信,问题是每次用户更新浏览器组件时都必须重新加载模型。 @ace 您绝对不希望您的用户直接访问 PHP CLI。这对 Node.js 来说听起来不错,但这意味着带来额外的依赖。还有其他方法,例如长轮询 AJAX 请求 (Comet) 可以提供帮助,但无论如何,由于资源有限,限制了并发请求的数量,这对于 PHP 来说是一个难以解决的问题。 检查 swoole.co.uk - PHP with Async IO【参考方案2】:

我同意应该尽量避免在请求之间共享状态。但在极少数情况下,例如通过 HTTP 实现一个简单的消息队列,最好有这个功能。

对于 php,可以通过 php_shmop 扩展使用 IPC。

对于nodejs,我找到了this

【讨论】:

以上是关于HTTP 请求之间具有持久状态的模型的主要内容,如果未能解决你的问题,请参考以下文章

http和https

http和https

HTTP 原理

HTTP 原理

HTTP协议的状态

具有持久性的 HTTP POST 请求的非阻塞队列