【问题标题】:Can AJAX or PHP "echo" too much?AJAX 或 PHP 会“回声”太多吗?
【发布时间】:2025-04-03 02:30:01
【问题描述】:

这是一个更多关于服务器效率和可用性的问题。

假设我有一个调用 AJAX 脚本的 php 页面,并且有 100 万用户在同一秒内连接。

如果我将 AJAX 脚本限制为只回显一次而不是每次接收数据时,是否会提高性能?

我计划将所有数据打印到一个变量中,然后在脚本完成后回显该变量。

我不确定回显是否只是在脚本完成之前将数据存储在服务器中,类似于我在上面想要做的事情,或者它是否实际上每次都与客户端连接?

如果为每个回显建立连接,那么这会比用数据填充变量更好,可能会导致 RAM 快速填满?

此 AJAX 脚本正在从数据库中提取数据(调用 PHP 页面)。我有很多“echo”语句,它们只是打印 table、div、tr 等标签,最后是来自数据库的数据。然后,再次打印 table、div、tr 等标签。你说最好用这些数据填充一个变量并打印/回显一次?

谢谢,

【问题讨论】:

  • 你的问题对我来说很模糊。如果你能澄清(也许是一个例子)会有所帮助。
  • 您要解释的是关于 CACHING 结果,对吧?
  • @mrsafraz 我想要么将所有数据存储在一个变量中,然后使用一个 echo 语句发送,要么每次我想发送表格、div、文本等内容时使用一个 echo 语句。在 AJAX 调用 PHP 页面时,哪个更好?
  • 我明白了。我已经发布了答案。在这种情况下,我的回答是——两种方式都不会有性能差异。你可以用你方便的方式来做。如果您考虑性能,则可以将结果缓存在浏览器中。

标签: php ajax echo


【解决方案1】:

通常,服务器处理脚本并以 HTML 的形式发送输出,因此页面和服务器之间不再有链接。当您发出 AJAX 请求时,您将再次打开连接并发送请求。

性能中的主要瓶颈来自您发送到服务器的请求量。您应该尽可能地限制请求。

如果为每个回显建立连接,那么这比用数据填充变量要好,这可能会导致 RAM 快速填满。

你错了,你应该尽量减少请求,尤其是当你处理大量的人时。


接下来,每次更新内容几乎没有意义。看看 facebook 如何更新其内容。计时器和内容每分钟更新一次。除了通知部分。

【讨论】:

  • 如果服务端开启了keep-alive,AJAX调用能否重用已有的连接?
  • @Pierre-OlivierBourgeois,Apache KeepAlive 指令指定从客户端到 Apache 服务器的 TCP/IP 连接将在 KeepAliveTimeout 值指定的给定持续时间内保持“活动”。因此,它仅在您处理繁重的请求时才有用。
  • @Starx 这里有更多细节。这个 AJAX 脚本正在从数据库中提取数据(调用 PHP 页面)。我有很多“echo”语句,它们只是打印 table、div、tr 等标签,最后是来自数据库的数据。然后,再次将 table、div、tr 等标签回显到 ajax 脚本。你说最好简单地用这些数据填充一个变量并将打印/回显一次到等待的 AJAX 脚本?谢谢,
【解决方案2】:

"I'm not sure if echoing is simply storing the data in the server until the script finishes, similar to what I want to do above or if it is actually connecting with the client each time?"

如果使用输出缓冲,则输出数据存储在输出缓冲区中,并作为一个整体数据发送到浏览器。例如:您的输出大小为 10kb,完成回显后发送完整的 10kb 数据。

否则输出会以一定数量的输出大小间隔发送,具体取决于您的 PHP 配置设置。例如:您的输出数据大小总共为 10kb,当达到 2kb、4kb、6kb、8kb 和 10kb 数据时发送输出。

但是,

it is NOT connecting with the client each time

有时,它还取决于浏览器。不同的浏览器以不同的方式处理它。

如果你考虑性能,你也可以看看caching your ajax results

【讨论】: