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。

4

3 回答 3

1

如果数据库查询如此昂贵,最简单的方法是将整个生成的输出写入文件并仅输出文件,而不是每次加载页面时都查询数据库。您所要做的就是在数据库更改时删除/更新文件。

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

于 2013-01-05T18:14:54.370 回答
1

我一直在max-age指令中使用缓存控制。

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

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

  • 将数据库查询的结果写入文件并根据生成日期命名。
  • 在执行这些调用的文件中,让它查看缓存文件的生成日期,如果它超过一天,请重新生成它。如果它更年轻,只需读取/使用缓存。

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

于 2013-01-05T18:28:15.907 回答
1

在我看来,您正在对标签中的数组进行硬编码。如果数组真的很大,浏览器必须加载更多字节。

考虑将 AJAX 与 JSON 结合使用。使用例如 jQuery 从另一个脚本加载数据。例如 api.php?req=getBigArray。加载数组时,jQuery“成功”回调运行逻辑。这意味着将完成两个 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,但需要在服务器端安装额外的软件。

于 2013-01-05T18:32:21.357 回答