PHP/HTTP非无状态

PHP/HTTP非无状态,php,database,http,data-storage,Php,Database,Http,Data Storage,PHP使用cookies、会话或数据库(以及ORMs)来记住数据(因此在单个HTTP请求后不会丢失数据)。然而,在Java中(我指的是servlet等),还有另一种解决方案:简而言之,您可以为一个对象选择不同的作用域(它存在的时间)。除了会话作用域或简单的单个HTTP请求“生命”(作用域)之外,它还可以在整个HTTP服务器运行时“生存”,并可以在HTTP服务器启动时初始化 因此,数据可以在不同的用户/会话之间共享,并且不需要数据库请求(导致整个web应用程序的效率降低)。(我的意思是,当HTTP

PHP使用cookies、会话或数据库(以及ORMs)来记住数据(因此在单个HTTP请求后不会丢失数据)。然而,在Java中(我指的是servlet等),还有另一种解决方案:简而言之,您可以为一个对象选择不同的作用域(它存在的时间)。除了会话作用域或简单的单个HTTP请求“生命”(作用域)之外,它还可以在整个HTTP服务器运行时“生存”,并可以在HTTP服务器启动时初始化

因此,数据可以在不同的用户/会话之间共享,并且不需要数据库请求(导致整个web应用程序的效率降低)。(我的意思是,当HTTP服务器已经运行时,它们不是必需的——对象及其状态是“记住的”)

(我尽我所能减少SQL请求,甚至使用PHP数组进行频繁读取,但实际上从未修改过DB数据)

我在PHP中需要的是一种方法:

  • 记住(存储在某处)可以在多个用户之间更改和共享的数据,但不能存储到数据库中
  • 在不使用会话(或cookie)的情况下,我希望为多个请求提供多个数据信息(等。AJAX不是单个的,而是对同一URL的多个请求),当然这些请求必须存储在其他地方一段时间。例如,我想用一个SQL请求读取所有数据(行),在PHP中记住它们一小段时间,然后,一行一行地将响应发送到相应的AJAX函数中

  • 任何人都可以给我一些提示,我如何在PHP中实现这一点,最好是最简单的方法?

    作为这个答案的序言(我相信您已经掌握了),PHP的执行模型本质上是在请求之间“重新启动”进程,因此仅在PHP中存储任何交叉请求都是不可能的

    这就给您留下了一些选择,它们都是数据库的真正“优势”:

  • 在内存持久层中使用一个简单的键值,如memcached或Redis
  • 使用结构稍微多一点的noSQL解决方案(如果需要一致性的话),但它仍然在内存中工作,并且比RDB快得多
  • 使用RDBMS是因为它工作得很好,而且在中等硬件上推翻精心设计的模式所需的流量可能比您想象的要高得多

  • HTH

    有效地处理这类事情实际上就是数据库的作用。我之前用数据库做过。但是,当您有50或100行要从数据库中读取时,您的应用程序将运行得非常慢,因为您必须为每个AJAX请求执行每个SQL请求。因此,我希望有一个SQL请求,为许多AJAX请求保存行(在PHP或其他短时间内),这样DB只使用一次。在Java中,正如我提到的,您可以简单地使用具有适当作用域的对象。使用临时文件并非不可能。通常,它们由操作系统缓冲,您也可以从内存中使用tmpfs文件系统。您还可以选择将内存中的对象存储到php加速器(xcache、eaccelerator)或使用shmem或一些支持库。感谢anttir,我将查看它。Ad 1。我会仔细研究这个解决方案,谢谢。公元2年。我看不出有什么不同的解决方案比使用广告1?公元3年。我的情况不是这样的。请看,问题在于许多SQL请求的事实——DB服务器与Apache/PHP位于不同的物理服务器上(有一些限制)。我想通过只向Apache/PHP发送一个DB响应来克服这个“物理”问题。#2适用于您可能希望在重启期间持久存储数据,但不涉及RDB的用例。不过,根据您所说的,您希望构建更多从其他地方提取的数据缓存——在这种情况下,使用#1可能是您的赢家。只是要注意在数据库中更新后缓存中的数据,以及刷新数据的频率等。HTH.Ok。你能给我举一些更具体的例子来解决#2案件吗?(现在听起来有点抽象)。我会很快地转移话题到noSQL和SQL,这是一个在谷歌的帮助下很容易研究的主题,但在你们的情况下,我想你们可以存储关系完整性等不重要的数据,并且你们不想使用外部RDB服务器。这些数据可能是特定于域的。