早上好。
我目前正在尝试为我的一个脚本构建一个非常基本的缓存系统。缓存是 JSON 数据,只包含 1 个键和它的值,但是有很多单独的字段,像这样;
{"Item1":"Item1 Description"}
{"Item2":"Item2 Description"}
{"Item3":"Item3 Description"}
我打算做的是;
- 首先检查缓存文件是否可用
- 然后检查缓存中是否存在某个项目
- 然后添加新项目及其描述(如果它尚未在缓存中)...
- ...如果不存在,则返回项目描述。
所有存储的数据都是字符串。缓存文件不存储任何其他类型的数据。
我已经整理了一个基本功能,但我无法让它发挥作用;
function ItemIsInCache($CacheFile, $ItemId) {
if(file_exists($CacheFile)) {
$json = json_decode(file_get_contents($CacheFile, true));
if(in_array($ItemId, $json)) { // <<
$itemname = array_search($ItemId, $json);
return itemname;
} else {
$item[$itemId] = GrabItemName($ItemId);
$itemname = array_search($ItemId, $json); // <<
return $itemname;
}
} else {
$item[$ItemId] = GrabItemName($ItemId);
$ejson = json_encode($item);
file_put_contents($CacheFile, $ejson);
return $item[$ItemId];
}
}
笔记
GrabItemName
是一个不同的函数,它基于$ItemId
.
我收到的警告分别Wrong datatype for second argument
在第 4 行array_search()
和in_array()
第 9 行中(这些是上面代码中的行号 - 由于我的脚本的性质,这些数字在后面) - 为简单起见,我已经用 标记问题行// <<
。
该函数在我没有问题的循环中运行。问题在于这个函数。
目前发生的事情
现在,如果缓存不存在,它会创建它并将循环中的第一项添加到其各自的 JSON 格式的缓存文件中(由于缓存文件不存在,所以在最后的else
语句之后触发)。
但是,之后循环中的项目不会被添加,大概是因为文件存在并且代码有问题。
该函数的最后一部分完全按照我的意愿工作,但第一部分没有。
使用固定代码的预期行为
检查缓存 > 如果项目存在则返回描述 否则将新项目添加到缓存。
这些项目及其相关描述不会改变,但我将它们从速率受限的 API 中提取出来,并且我需要确保我缓存任何我可以为每个人受益的内容。
那么,有什么想法我在功能上做错了吗?我确信这是我忽略的非常简单的事情。