一个OA优化后台数据输出之后存在两个问题:
- 后台更新的数据不能在前台实时同步,需要硬刷新;
- 以文件类型检索文章拿不到任何数据。
第一:先解决前后台数据实时同步问题。
分析优化后的后台输出数据机制,是在增删改内容模块将数据库相关记录导出为JS文档供前台Web页使用,前台 .php Web页使用 <script src="xxx.js"></script> 的方式调用后台导出的数据,其目的是为了减轻数据库服务器压力。
众所周知,浏览器会将JS等资源放入缓存区,同名资源在下次访问时优先从缓存区调取,因此当后台输出了新的数据,访问者未必能够在第一时间自动同步,除非硬刷新(客户端操作,不现实)或在网页端强制客户端每次访问都下载新的资源(增加服务器负担,不推荐)。经一番研究,形成解决思路,具体操作如下:
(一)后台更新数据的实现模块添加一个提供数据版本号机制
// 生成一个PHP文档用以记录数据版本号
$verFile = "jsdataversion.php"; // 文件名
$time = time(); // 时间戳做版本号
$contents = "<?php \$data_ver = $time; ?>"; // 文件内容
file_put_contents($verFile, $contents); // 写入文件
使用时间戳做版本号比较省事,避免人工添加的麻烦和可能出现的版本号大小错误。
(二)前台数据渲染页面 .php 文档加入JS版本号
// PHP部分 :获取版本号
$data_ver = time(); // 初始化版本号为当前时间戳
// 如果存在版本号文件则覆盖上述版本号
if (is_file($dataFile)) require $dataFile;
<!-- JS部分 -->
<script charset="utf-8" src="contentdata.js?v=<?php echo $data_ver; ?>"></script>
如此一来,客户端总会拿到最新的JS数据资源,且访问之后的后续访问如果后台没有更新版本号浏览器不会重新下载JS数据,某种程度上还能有效减轻服务器负担。
第二:解决客户端以文件类型做检索时结果为空的问题。
此问题略为复杂,因为此次优化后台数据输出机制先后由两个实习团队接力完成,而前台的数据检索功能基于第一团队导出的数据结构,第二团队的操作工作重心放在进一步优化后台数据的输出,时间关系来不及对检索功能做配套修正。好在网管保留有所有原始代码和改造企划,几经折腾,终于从中找到问题的根源所在——最终导出的数据格式和前面检索功能正常运行时的数据格式存在细微区别:此前的数据全是标准的 JSON 类型的数组,亦即所有的键名、键值全部使用引号包裹,但最后定型的优化导出的数据结构则是,键值为数字的没有使用引号。
而文件类型索使用的是类型索引号,该索引号从下拉菜单中获取,自然状态下是字符型。新输出的数据结构中记录文件类型的则是整数型,二者在变量类型上并不匹配,自然就无法检索到有效数据。
原比对语句为:
if (sort && item.sort !== sort) return false;
这里,当 sort 作为字符型变量时,条件语句中的第一个判断 sort 没有什么不妥,但用它去匹配第二个判断条件就行不通。为稳健起见,改造得分两步走:
// 第一步 :获取用户选择的文件类型索引号
const sort = parseInt(art_sort.value); //类型索引强制为整数
// 第二步 :改造 sort 的条件比对方式
if (sort >= 0 && item.sort !== sort) return false;
实际操作时上述两个步骤并不在同一个代码块中操作,不过道理都一样:统一变量类型并根据变量特点改变条件比对方法。
本次改造总体非常顺利,首先得益于网管对数据的完好备份和相关信息的完整存留,给改造工作提供有效线索,便于快速查找问题的根源;其次是充分利用PHP的基础能力,令其向JS提供有用信息;最后是得益于对JS变量类型的充分理解。