アプリ版:「スタンプのみでお礼する」機能のリリースについて

こちらのサイトで見つけたYahoo!APIのサンプルを使って画像検索のサービスを作ってみたのですが、
1つ問題があり検索されるごとに画像のキャッシュファイルがたまっていき、
レンタルサーバーの容量を圧迫していきます。

http://phpspot.net/php/pgPHP%E3%81%A7Yahoo!API%E …
↑のサイトのyapi.zip内のimage.phpのものです。

このimage.phpの38行目には「1h キャッシュ有効」と記載してあったのですが、
実際は1時間以降経ってもキャッシュが消える気配はありません。
(もしかしたら1時間以内に同一クエリを投げられた場合はAPIを叩きにいかないという意味なのかもしれませんが)

そこで一定時間が経過したらcacheフォルダに溜まっていくファイルを削除したいのですが、
ソースコードの書き換え、またはcacheフォルダ内の画像をワンボタンで削除できる方法を教えていただければ幸いです。
FTPからcacheフォルダを一度削除し再作成する方法だと手間が多いので・・・

よろしくお願いいたします!

A 回答 (3件)

視覚用ファイルです。


といってもフォーム化しただけですが。


<html>
<head>
<title>Yahoo!APIキャッシュファイル削除スクリプト</title>
</head>
<body>
<?php
if($_GET["act"] == "submit"){
$cachefld = "./cache"; // 調査するフォルダ
$targetTime = 1; // 削除対象の基準タイム(時間)

if($handle = opendir("$cachefld")){
$time = time() - $targetTime * 3600;
$cnt = 0;
while(false !== ($itemName = readdir($handle))){
if($itemName != "." && $itemName != ".."){
if(filemtime("$cachefld/$itemName") < $time){
unlink("$cachefld/$itemName");
$cnt++;
}
}
}
closedir($handle);
if($cnt > 0){
echo $cnt."ファイルを削除しました。";
}
else{
echo "削除対象ファイルはありませんでした。";
}
}
else{
echo "キャッシュフォルダの読み込みに失敗しました。";
}
}
else{
?><form action="<? echo $_SERVER["PHP_SELF"]; ?>" method="get">
<input type="hidden" name="act" value="submit">
<input type="submit" value="キャッシュ削除">
</form>
<?
}
?></body>
</html>
    • good
    • 0
この回答へのお礼

ありがとうございます!

まさにこれが欲しかった内容になります!!

お礼日時:2011/05/21 20:03

提示したスクリプトを保存して、お気に入りにいれておけば、


お気に入りからアクセスするだけで削除されます。
フォーム経由でアクセスするよりも簡単だし、他人がアクセスすることも
ないので、便利だと思いますが、いかがでしょう?
どうしても必要だということならフォーム化しますが。

Cronが使えなくても自動が楽でしょうから、勝手にやらせるなら、
検索時に、キャッシュが有効な時は、APIへのアクセスがなく、
負荷が軽減されている時なので、そこで処理をさせるということもできます。
念のため、多くのアクセスがない様、フラグのフォルダを作って、
頻繁にキャッシュの削除がされないようにします。

cacheフォルダがある同階層のディレクトリに
cacheflgfldをパーミッションを777で生成して下さい。
yimg.php の36行目から47行目を以下に書き換えます。
#書き換えた行は//でコメント化しています。

//$cachename = "cache/img".md5($query.$start);
$cachefld = "cache"; // キャッシュフォルダ
$cachename = $cachename."/img".md5($query.$start);
$targetTime = 3600; // 削除対象の基準タイム(秒)
$cachedelflgfld = "cacheflgfld";

//if (file_exists($cachename) && time () < (filemtime($cachename)+3600)) { // 1h キャッシュ有効
if (file_exists($cachename) && time () < (filemtime($cachename)+$targetTime)) { // 1h キャッシュ有効
// キャッシュの無効ファイルを削除
if(time() > @filemtime($cachedelflgfld) + $targetTime){
if($handle = opendir("$cachefld")){
$time = time() - $targetTime * 3600;
while(false !== ($itemName = readdir($handle))){
if($itemName != "." && $itemName != ".."){
if(filemtime("$cachefld/$itemName") < $time){
unlink("$cachefld/$itemName");
}
}
}
}
closedir($handle);
mrdir($cachedelflgfld);
}
$xml_str = join("",file($cachename));
} else if ($query != "") {
$xml_str = join("",file("$serv?query=$query_e&appid=$appid&adult_ok=$adult_ok&results=$results_count&start=$start"));
$fp = fopen($cachename,"w");
fputs($fp,$xml_str);
fclose($fp);
} else {
$xml_str = "";
}

使うなら未テストなので、正常に稼動するかテストして下さい。

この回答への補足

ご回答ありがとうございます。

こちらの方法を試してみたかったのですが、
cacheフォルダを削除した直後にcacheflgfldのフォルダを作りにいこうとしたところ
アクセスが多くファイルがかなり溜まっておりcacheフォルダを開くことが出来ませんでした。

出来ましたら最初にご教授いただきました削除ページのフォーム化をいただけると幸いです。
最初の削除ページアクセスでもファイル削除は行えたのですが、
cron用に作られたというところもあり
削除実行を視覚的に確認したいのと、実行結果の文言表示もあると幸いです。

よろしくお願いいたします。

補足日時:2011/05/20 09:07
    • good
    • 0

キャッシュの有効時間は、キャッシュファイルを使うか、


APIから情報を得るかの判定で使われているようで、
削除などは、独自でする必要がありますね。
以下は、指定したタイムを越えているファイルを削除するものです。


<?php
$cachefld = "./cache"; // 調査するフォルダ
$targetTime = 1; // 削除対象の基準タイム(時間)

if($handle = opendir("$cachefld")){
$time = time() - $targetTime * 3600;
while(false !== ($itemName = readdir($handle))){
if($itemName != "." && $itemName != ".."){
if(filemtime("$cachefld/$itemName") < $time){
unlink("$cachefld/$itemName");
}
}
}
}
closedir($handle);


これをファイル保存して、Cronなどで定期実行してあげれば
期間を超過したキャッシュファイルは自動的に削除されます。

くれぐれも「調査するフォルダ」へのパス指定で間違いがありませんように。

キャッシュフォルダには、フォルダは含まれないようなので、
再帰的な処理などは入れていません。

公開フォルダに、このファイルを入れると好ましくないので、
できれば非公開フォルダに保存するほうが良いです。
どうしても公開フォルダに入れる必要があれば、
誰にも想像が付かないようなファイル名に保存すると良いです。
とりあえず、自身以外の方が実行できない環境を。ということで。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

やはり私のキャッシュに対する認識の違いがあったようですね。

ご提示いただいたファイル削除のphpですが、
残念ながら自分が使っているレンタルサーバーだとCronが使えません。

出来ましたらsubmitボタン押下で削除が行えるページ構成になっていると助かります。
要望が多く申し訳ございません。

お礼日時:2011/05/18 10:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!