缓存php生成的javascript页面


Caching a php generated javascript page

我有一个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.

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

考虑将AJAX与JSON结合使用。使用示例jQuery从另一个脚本加载数据。如api.php ?要求= 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,但是需要在服务器端安装额外的软件。

如果数据库查询的开销太大,最简单的方法是将整个生成的输出写入一个文件,然后只输出该文件,而不是在每次加载页面时查询数据库。你所要做的就是在数据库发生变化时删除/更新文件。

您还应该考虑查看内存缓存,并尽可能优化您的查询。

我一直在max-age指令中使用cache-control。

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

,但我也同意前面的评论。如果您的db调用确实非常昂贵,请考虑抵消这些调用的频率。例如,如果你想每天更新一次数据库缓存,我会这样做。

  • 将数据库查询的结果写入一个文件,并根据生成日期命名。
  • 中执行这些调用的文件,让它查看缓存文件的生成日期,如果它超过一天,则重新生成它。

你可以选择你可以让IIS通过任务调度程序运行更新脚本,然后你的脚本使js永远不能做年龄检查,只是从缓存中读取。