0

我正在构建一个 Web 应用程序,我启动该应用程序以进行测试的方式是将大量数据从我的数据库加载到会话数组中,这样我就可以在整个页面中轻松使用这些值。我有一个页面,上面有很多选择,每次 php 页面循环遍历所有变量,选择选定的一个,然后输出下拉列表。我的一个数组虽然只有不到 3000 个值,但加载这个下拉列表会使页面从大约 300 毫秒减慢到 1-1.2 秒。并不可怕,但很容易看出它的响应速度较慢。因此,我想知道是否有任何方法可以提高加载速度,或者对替代下拉菜单有什么想法。

到目前为止我已经尝试过:

  1. 会话数组保存所有值,当页面通过 jquery ajax 方法加载时,php 页面循环遍历这些值并回显下拉列表。

  2. PHP 包含 - 创建预先编写为选择的所有值的 php 或 html 页面,这将为问题下拉列表创建一个约 100kb 的页面,然后将其包含在include. 需要大致相同的数量加上我必须使用 javascript 来设置值,但如果可以改进,我会这样做。我想也许一些缓存可以在这里提供改进。html 和 php 页面之间似乎没有显着差异,但我认为 html 会更好。我还假设我不能使用常规缓存,因为我正在使用 php 函数来包含这些页面。

  3. 我试过只加载 html 页面,第一次加载大约需要 1 秒,在浏览器缓存之后它又回到了 100-350 毫秒,所以我想缓存可以极大地提高性能。

我考虑过:

  1. 创建整个页面的缓存版本,但这实现起来会很痛苦,所以我只会在人们认为这是正确的方法时才这样做。我将不得不使用 ajax 来检索我最初使用 php echos 进行的输入的一些数据。

  2. 只需删除问题下拉列表。

只是为了澄清一些我从未澄清过的事情,我认为 php 页面永远不会被浏览器缓存是否正确,因此通过扩展任何 php 包含的文件也不能。但是,为什么可以缓存链接到 php 文件中的 javascript 文件,因为它使用的是 html 方法?

4

2 回答 2

1

我怀疑问题出在您传输的数据的原始大小上,基于“到目前为止我已经尝试过什么”中的数字 2 的结果。我认为您不能依赖浏览器缓存,并且服务器端缓存不会改变传输数据的大小。

以下是一些减少页面加载期间传输的数据量的想法:

  1. 在交付主页后,使用异步 javascript 调用单独加载选择框。
  2. 将选择分解为一系列层次结构的选择。用户选择顶级类别,然后另一个选择框填充匹配的子类别。当他们选择一个子类别时,第三个框会填充该子类别中的实际选项。像 这样的东西。当然,这仅在使用异步 javascript 调用填充第二和第三控件时才有效。

无论哪种方式,请确保在您的服务器上启用 gzip 压缩。

编辑:关于浏览器缓存
的更多信息 浏览器缓存单个文件,您通常不会要求它缓存 PHP 页面,因为下次它们可能会有所不同。(单个 php 包含对浏览器是不可见的,因为 PHP 将它们的内容组合到 HTML 流中。)如果您使用浏览器的开发人员控制台(例如,在 Chrome 上按 f12 并转到网络),您可以看到大多数页面会导致多个从浏览器到服务器的请求,您甚至可能会看到其中一些文件(js、css、图像)来自缓存。

浏览器缓存的内容和缓存时间由各种 HTTP 响应标头控制,例如Cache-ControlExpires. 如果您不通过调用header函数在 php 中覆盖这些,它们将由 Web 服务器 (Apache) 配置控制。

于 2012-10-23T23:39:36.933 回答
1

返回并解析为下拉列表的数据可能是您的瓶颈。但是,如果瓶颈实际上是 PHP 代码,您可以尝试在http://php.net/manual/en/book.apc.php安装类似 APC 的 optcode 缓存。它会加速你的PHP。(Zend Optimizer 也可在以下网址获得:http ://www.zend.com/en/products/guard/runtime-decoders )

如果您的瓶颈是下拉列表中的项目来自的数据库,您可能需要尝试设置 MySQL 以缓存结果。

您可能还想尝试使用 AJAX 在用户向下滚动时填充下拉列表的替代下拉列表,一次填充几条记录。您还可以将其创建为文本字段,在用户键入时提示可能的匹配项。这些事情可能会更快。

于 2012-10-23T23:50:31.303 回答