我有一个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。
答案 0 :(得分:1)
如果数据库查询很昂贵,最简单的方法是将整个生成的输出写入文件,只输出文件,而不是每次加载页面时查询数据库。您需要做的就是在数据库发生变化时删除/更新文件。
您还应该考虑查看内存缓存,并尽可能优化查询。
答案 1 :(得分:1)
我一直使用带有max-age
指令的缓存控制。
header('Cache-Control: max-age=' . $expires);
header('Expires: ' . gmdate('D, d M Y H:i:s', time() + $expires) . ' GMT');
但我同意之前的评论。 如果您的数据库调用确实非常昂贵,请考虑抵消这些调用的频率。例如,如果你想每天更新一次数据库缓存,我会做这样的事情。
你可以选择让IIS通过任务调度程序运行更新脚本,然后你的脚本使得js永远不会进行年龄检查,只需从缓存中读取。
答案 2 :(得分:1)
在我看来,你是在标签中硬编码数组。如果数组非常大,浏览器必须加载更多字节。
考虑将AJAX与JSON结合使用。使用例如jQuery从另一个脚本加载数据。例如。 api.php?REQ = getBigArray。并且jQuery“success”回调在加载数组时运行逻辑。这意味着将完成两个http请求,但它会立即加载您的页面。
Serverside:
<?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,但需要在服务器端安装额外的软件。