大选择减慢页面加载 - 缓存PHP

时间:2012-10-23 23:24:56

标签: php caching

我正在构建一个Web应用程序,我从应用程序开始进行测试的方式是从我的数据库中将大量数据加载到会话数组中,这样我就可以在整个页面中轻松使用这些值。我有一个页面上有很多选项,每次php页面遍历所有变量,选择所选变量,并输出下拉列表。我的一个阵列虽然有不到3000个值,但加载此下拉列表会使页面从大约300毫秒减慢到1-1.2秒。不是很糟糕,但很容易分辨它反应迟钝。所以我想知道是否有任何方式让我提高加载速度,或者对替代下拉列表的任何想法。

到目前为止我尝试过:

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

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

  3. 我已尝试在html页面中加载,首次加载时大约需要1秒,浏览器缓存后它恢复到100-350毫秒,所以我想缓存可以提供巨大的性能提升。

  4. 我考虑过:

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

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

    3. 只是为了澄清一些我从未澄清过的内容,我认为php页面永远不会被浏览器缓存,因此通过扩展,任何包含php的文件都不能。但是,如何在php文件中链接的javascript文件可以缓存,因为它使用的是html方法?

2 个答案:

答案 0 :(得分:1)

我怀疑问题是您传输的数据的原始大小,基于“我到目前为止所尝试的内容”中的数字2的结果。我不认为你可以依赖浏览器缓存,而服务器端缓存也不会改变传输数据的大小。

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

  1. 在主页面之后单独加载选择框 使用异步javascript调用传递。
  2. 将选择分解为一系列分层选择。用户 选择顶级类别,然后填充另一个选择框 具有匹配的子类别。当他们选择一个子类别时, 第三个框填充该子类别中的实际选项。就像是 this。 当然,这只有在使用异步填充第2和第3个控件时才有效 javascript来电。
  3. 无论哪种方式,请确保您的服务器上启用了gzip压缩。

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

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

答案 1 :(得分: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在用户向下滚动时填充下拉列表的替代下拉列表,一次只能记录几条记录。您还可以将其创建为文本字段,在用户输入时提示用户输入可能的匹配项。这些事情可能会更快。