PEARのCache_Liteでapiからの画像をキャッシュするプログラムを作っていますが壁にぶち当たっています。ソースは下に記載させていただきます。


実行すると、$queryword = "ハウステンボス";から「ハウステンボス」の画像が表示され、キャッシュを保存するディレクトリ(tmp)にファイルが保存されます。
しかし、$queryword を「東京ディズニーランド」に変更して実行しても、保存した「ハウステンボス」関係のファイルが$data = $Cache_Lite->get($id); if ($data !== false) { で該当してしまい、「東京ディズニーランド」の画像を表示するハズが、そのまま「ハウステンボス」の画像になってしまいます。これを回避するために$querywordを含むurlを$idとしているのですが、有効でないようです。

皆様のお知恵を拝借したく思っています。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2012/11/30 18:12:27
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。
id:ozaki

質問者から

ozaki2012/11/30 12:05:54

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

<title>キャッシュを導入</title>

</head>

<body>

// Cache_Liteのプログラムを読み込む

require_once 'Cache/Lite.php';

$dir = "/home/users/1/lolipop.jp-withmama/web/kaihatsu/ad/list_added_clients/add_inc/tmp";

if (!file_exists($dir)) {

mkdir($dir, 0777);

echo "キャッシュ用のディレクトリを作成しました";

}

//キャッシュオプション設定

$cacheOptions = array(

'cacheDir' => './tmp/', //tmpディレクトリに設定

'lifeTime' => '9600', //秒単位

'caching' => 'true',

'automaticCleaningFactor' => '20',

//新規キャッシュファイル保存時の期限切れファイル自動削除設定。例の場合1/20の確率で削除される

'pearErrorMode' => CACHE_LITE_ERROR_DIE,

// 'automaticSerialization' => 'true', // 配列を保存可能に

);

//キャッシュID設定

$id = md5( $req );

//Cache_Liteオブジェクト生成

$Cache_Lite = new Cache_Lite($cacheOptions);

//キャッシュがあるかどうかテスト

$data = $Cache_Lite->get($id);

if ($data !== false) {

//有効なキャッシュがある場合の処理

// キャッシュデータを表示

echo "キャッシュがある";

echo $data;

}else{

//有効なキャッシュがない場合の処理

echo "キャッシュがない";

//データを生成する

function imageSearch($queryword,$results){

//XMLデータ取得用ベースURL

$req = "http://search.yahooapis.jp/PremiumImageSearchService/V1/imageSea...";

//検索語をリクエストに追加

$req .= "&query=". urlencode($queryword);

//検索の詳細指定

//all :全クエリー文字を含む検索結果 any :クエリー文字のうちいずれかを含む検索結果

$req .= "&type=".all;

//検索結果の表示件数

$req .= "&results=".$results;

$id = md5( $req );

//XMLファイルをパースし、オブジェクトを取得

$xml = simplexml_load_file($req)

or die("XMLパースエラー");

$ret = '

';

foreach ($xml->Result as $item_img){

$ret .= "Thumbnail->Url."\">";

}

$ret .= "

";

return $ret;

}//ここまでがfunction imageSearch

//リクエストパラメータ設定

$queryword = "ハウステンボス";

$results = 3;

//関数をコールする

$data .= imageSearch($queryword,$results);

//生成したデータを表示

echo $data;

//データをキャッシュ保存

$Cache_Lite->save($data,$id);

} //ここまでが有効なキャッシュがない場合の処理

?>

</body>

</html>

ベストアンサー

id:a-kuma3 No.2

回答回数4974ベストアンサー獲得回数2154

ポイント100pt

あのー、Cache_Lite::get を呼ぶ前に、$req 変数の内容が設定されてないのが、原因じゃないかと思うんですけど。
だから、$id も常に同じ値。

その他の回答1件)

id:oil999 No.1

回答回数1728ベストアンサー獲得回数320

コンストラクタ get の第2引数にキャッシュグループ名を指定してみて下さい。

Cache_Lite::get(公式マニュアル)

http://pear.php.net/manual/ja/package.caching.cache-lite.cache-lite.get.php

【参考】PEAR::Cache_Liteで簡単キャッシュ

http://itpro.nikkeibp.co.jp/article/COLUMN/20070507/270072/

id:a-kuma3 No.2

回答回数4974ベストアンサー獲得回数2154ここでベストアンサー

ポイント100pt

あのー、Cache_Lite::get を呼ぶ前に、$req 変数の内容が設定されてないのが、原因じゃないかと思うんですけど。
だから、$id も常に同じ値。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません