おはようございます。
現在、スクリプトの 1 つに対して非常に基本的なキャッシュ システムを構築しようとしています。キャッシュは 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
の両方array_search()
でin_array()
、それぞれ 4 行目と 9 行目にあります (これらは上記のコードの行番号です - 私のスクリプトの性質上、これらの番号は後述します) -- 簡単にするために、問題のある行を でマークしました// <<
。
関数はループで実行されていますが、問題はありません。問題はこの機能にあります。
現在起きていること
現在、キャッシュが存在しない場合は、キャッシュを作成し、ループの最初の項目をそれぞれの JSON 形式でキャッシュ ファイルに追加します (キャッシュ ファイルが存在しないため、最後のelse
ステートメントの後に発生します)。
ただし、おそらくファイルが存在し、コードに問題があるため、その後のループからのアイテムは追加されません。
関数の最後の部分は希望どおりに機能しますが、最初の部分は機能しません。
修正されたコードで予想される動作
キャッシュをチェック > アイテムが存在する場合は説明を返す ELSE 新しいアイテムをキャッシュに追加します。
アイテムとそれに関連する説明は変更されませんが、私はレート制限された API からそれらを取得しているので、全員の利益のためにできる限りキャッシュする必要があります。
それで、私が関数で間違っていることについて何か考えはありますか? 私が見落としているのは、信じられないほど単純なものだと確信しています。