我正在使用JSON文件自动填充下拉列表。它绝非庞大(3000行并且还在不断增长),但是刷新页面所花费的时间变得非常引人注目。
首次加载页面时,将读取JSON,具体取决于用户选择了哪个选项,从而决定了使用JSON的哪一部分来填充下拉列表。
然后将其加载到每次刷新或菜单选择之后。是否可以以某种方式缓存值以防止需要一次又一次地重新加载它?
谢谢。
编辑:更多信息:它本质上是一个单位转换器。JSON包含所有详细信息。例如,当用户选择“临时”时,将进行呼叫并填充列表。转换完成后,您可以全天运行临时转换,它们会很好,但是每当用户更改转换类型时,现在,页面长度就会刷新,并且会花费大量时间。
不幸的是,我不了解PHP中的标准化全局缓存机制。该文章说,被包含在PHP核心的5.5版本开始优化升级,第三方加速器。不知道您使用的是哪个版本,但是您可以尝试使用。
另一方面,您是否像安德鲁(Andrew)所指出的那样考虑了文件存储?$_SESSION
在这种情况下,我认为它可以为您提供真正的帮助。让我给您一个示例,该示例将与您现有的JSON数据一起使用:
服务器端
将JSON数据存储在.json
PHP服务器上的文件中:
{
"data": "some data",
"data2": "more data",
"data3": [
...
],
etc.
}
注意:请确保正确格式化JSON数据。请记住,所有字符串都必须用双引号引起来"
。
在PHP中,使用if语句确定适当的操作:
error_reporting(E_ALL);
ini_set("display_errors", "On");
session_start();
if(isset($_SESSION['dataCache'])) {
echo json_encode($_SESSION['dataCache']);
} else {
$file = 'data.json';
if (!is_file($file) || !is_readable($file)) {
die("File not accessible.");
}
$contents = file_get_contents($file);
$_SESSION['dataCache'] = json_decode($contents, true);
echo $contents;
}
因此,让我们进一步研究上面的编码。简而言之,这就是我们正在做的事情:
这将为您节省解析JSON数据和/或在服务器上手动构建JSON数据的时间和精力。它将为用户缓存,session
以便他们可以使用它。
客户端
我假设您是ajax
用来获取信息的?如果不是正确的话,但我假设这就是您的某些JavaScript发挥作用的地方。如果是这样,您可以考虑一下:
sessionStorage
从服务器返回的数据存储在用户的浏览器中:
$.ajax({
...
success: function (res) {
localStorage.setItem("dataCache", JSON.stringify(res));
},
...
});
或者,如果您使用Promise对象:
$.ajax({
...
}).done(function (res) {
localStorage.setItem("dataCache", JSON.stringify(res));
});
当您需要阅读它时,可以做一个简单的测试:
var data;
// This returns null if the item is not in local storage.
// Since JavaScript is truthy falsy, it will be evaluated as false.
if(localStorage.getItem("dataCache")) {
data = JSON.parse(localStorage.getItem("dataCache"));
} else {
// Make ajax call, fetch object and store in localStorage in the success or done callbacks as described above
}
笔记:
localStorage
是HTML5中的一项新功能,因此尚不完全支持所有浏览器。但是,大多数主要的工具都可以,甚至可以追溯到IE8(我认为)。但是,对于每个站点最多需要容纳多少个浏览器,没有标准化的大小限制。
重要的是要考虑到这一点。我可以保证您可能无法将整个30,000行字符串存储在localStorage中。但是,您可以以此为起点。结合服务器端解决方案,您应该会看到性能提高。
希望这可以帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句