缓存 PHP 生成的 JavaScript 页面

3

我有一个使用php生成的javascript页面,从数据库创建一个数组,但是加载时间非常慢。该页面具有php扩展名,并且当前正在使用标题将其内容类型标记为application/javascript。

我在网上找到了一个可能的解决方案,但似乎并没有太多提高页面加载速度。目前,我的文件头代码如下:

header("Cache-Control: must-revalidate");
$offset = 60 * 60 * 24 * 3;
$ExpStr = "Expires: " . gmdate("D, d M Y H:i:s", time() + $offset) . " GMT";
header($ExpStr); 
header("Content-type: application/javascript");

我需要做什么特殊处理来缓存文件,以免它不断尝试加载这些数据库调用?我正在使用IIS 7.5和PHP 5.3.13。


考虑阅读有关缓存的 HTTP/1.1 规范的其他部分。您可能正在接收一个“条件 GET”请求,要求重新验证缓存条目。 (这是在按“重新加载”按钮而不是转到地址栏并按Enter时发生的。)您可以用新鲜的响应响应条件GET;您可以明确地检查此内容,然后返回一个空的HTTP 304响应。基本上,仅设置“Expires”很少足以进行缓存。 - millimoose
也许http://codereview.stackexchange.com/在这种情况下会更适用... - user752723
致愚蠢的产品: 我正在使用SQLSRV扩展。 - gdawgrancid
此外,除了随机的互联网建议之外,我建议您仔细阅读HTTP缓存规范:http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html。虽然它不是轻松的阅读材料,但就规范而言,它相当易懂。此外,谷歌的资源似乎也很好:https://developers.google.com/speed/articles/caching和https://developers.google.com/speed/docs/best-practices/caching?hl=en。 - millimoose
为了缓存数据库查询,您可以使用 Memcached - Yang
3个回答

1

我一直使用带有max-age指令的缓存控制。

header('Cache-Control: max-age=' . $expires);
header('Expires: ' . gmdate('D, d M Y H:i:s', time() + $expires) . ' GMT');

我也同意之前的评论。

如果你的数据库调用真的很昂贵,考虑减少这些调用的频率。例如,如果你想每天更新一次数据库缓存,可以像这样做:

  • 将数据库查询结果写入文件,并根据生成日期命名文件。
  • 在执行这些调用的文件中,检查缓存文件的生成日期,如果超过一天就重新生成,否则直接读取/使用缓存。

你还可以选择让 IIS 通过任务计划程序运行更新脚本,然后生成 JavaScript 的脚本就不需要进行年龄检查,直接从缓存中读取即可。


1

我觉得你是在标签中硬编码数组。如果数组非常大,浏览器必须加载更多字节。

考虑使用AJAX与JSON结合使用。例如使用jQuery从另一个脚本中加载数据。例如api.php?req=getBigArray。并使用jQuery的“success”回调函数在加载数组时运行逻辑。这意味着将执行两个HTTP请求,但它将一次性加载您的页面。

服务器端:

<?php //api.php
switch($_GET['req']){
 case "getBigArray": 
    $arrayFromDatabase = array( /* Load from db ... */ );
    echo json_encode($arrayFromDatabase); 
 break;
}

客户:

$(document).ready(function(){
    $.getJSON('api.php?req=getBigArray', function(data) {
        console.log(data); // Use data in some way.
    });
});

这也将逻辑从服务器端/前端解耦。

如果您想在后端缓存结果,还可以查看memcache/apc。非常简单的API,但需要在服务器端安装额外的软件。


看起来我得走AJAX这条路了。上面列出的缓存方法有些作用,但是数据库调用似乎很昂贵,迫使我不得不采取与我最初计划的不同路线。为了满足我的需求,我采用了稍微不同的逻辑,但这似乎是让我的页面加载时间变短的最佳和最简单的方法。 - gdawgrancid

1
如果数据库查询非常耗费资源,最简单的方法是将整个生成的输出写入文件,而不是每次加载页面时都查询数据库。然后,您只需要在数据库更改时删除/更新文件即可。
此外,您还应该考虑查看内存缓存,并尽可能优化查询。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接