こちらのサイトで見つけた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フォルダを一度削除し再作成する方法だと手間が多いので・・・
よろしくお願いいたします!
No.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>
No.2
- 回答日時:
提示したスクリプトを保存して、お気に入りにいれておけば、
お気に入りからアクセスするだけで削除されます。
フォーム経由でアクセスするよりも簡単だし、他人がアクセスすることも
ないので、便利だと思いますが、いかがでしょう?
どうしても必要だということならフォーム化しますが。
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用に作られたというところもあり
削除実行を視覚的に確認したいのと、実行結果の文言表示もあると幸いです。
よろしくお願いいたします。
No.1
- 回答日時:
キャッシュの有効時間は、キャッシュファイルを使うか、
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などで定期実行してあげれば
期間を超過したキャッシュファイルは自動的に削除されます。
くれぐれも「調査するフォルダ」へのパス指定で間違いがありませんように。
キャッシュフォルダには、フォルダは含まれないようなので、
再帰的な処理などは入れていません。
公開フォルダに、このファイルを入れると好ましくないので、
できれば非公開フォルダに保存するほうが良いです。
どうしても公開フォルダに入れる必要があれば、
誰にも想像が付かないようなファイル名に保存すると良いです。
とりあえず、自身以外の方が実行できない環境を。ということで。
ご回答ありがとうございます。
やはり私のキャッシュに対する認識の違いがあったようですね。
ご提示いただいたファイル削除のphpですが、
残念ながら自分が使っているレンタルサーバーだとCronが使えません。
出来ましたらsubmitボタン押下で削除が行えるページ構成になっていると助かります。
要望が多く申し訳ございません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Windows 10 Corsair SSDが遅い (2)WDに比べて 3 2023/04/25 11:21
- その他(プログラミング・Web制作) TwitterAPIを使用せずに自動ツイートする方法を知りたい。考え方としてはブラウザを擬似操作して 2 2023/02/02 17:16
- Photoshop(フォトショップ) 写真に日付を入れるのがそんなに大変か 9 2023/07/22 14:38
- Visual Basic(VBA) VBAでのフルパスの取得 1 2022/09/20 22:51
- Visual Basic(VBA) VBA Twitter 高度な検索 日付 単語 リンクをOutlook で送信 2 2022/06/18 18:36
- 仮想通貨(暗号通貨) 仮想通貨【アプトス】もうすごく上がる可能性は高い? 10万円を1億円い増やすyoutube動画 3 2022/10/23 21:49
- デスクトップパソコン 小型PCのオススメを教えてください 3 2022/09/18 19:39
- docomo(ドコモ) SIMフリー機種への乗り換えについて 7 2022/09/01 14:05
- CPU・メモリ・マザーボード Dell製ノートパソコンのメモリ増設についてです! 6 2023/06/10 21:31
- BTOパソコン DELL PC。マザーボード交換について。 10 2023/01/23 18:38
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA 最新のフォルダ取得
-
windowsでテキストファイルの各...
-
Windows10でコマンドプロンプト...
-
ファイル名と同名のフォルダを...
-
ExcelのVBAでフォルダ指定がで...
-
VBA フォルダ名に特定の文字を...
-
Dreamweaverでイメージを挿入す...
-
あるフォルダの中にあるファイ...
-
保存先のフォルダ名を指定した...
-
Access VBA で フォルダ権限...
-
パスを通したはずなのに「パス...
-
excel VBA Dirにて検索したフォ...
-
フォルダにリンクを貼りたい
-
フォルダ内のPDFファイル名を変...
-
Excelのハイパーリンクについて...
-
バッチファイルで指定フォルダ...
-
多量のファイルをフォルダに自...
-
Hitachi Embedded Workshop (HE...
-
エクセル マクロで指定フォル...
-
【マクロ】フォルダAからダBへ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Windows10でコマンドプロンプト...
-
パス名に2バイト文字(マルチバ...
-
ファイル名と同名のフォルダを...
-
VBA 最新のフォルダ取得
-
Excelのハイパーリンクについて...
-
デスクトップの画像をhtmlに表...
-
ディレクトリ名変更してコピー...
-
VBA フォルダ名に特定の文字を...
-
バッチファイルで指定フォルダ...
-
フォルダ内のPDFファイル名を変...
-
Access VBA で フォルダ権限...
-
excelマクロ 冒頭3文字が一致す...
-
【マクロ】ファイル名の日付に...
-
フォルダにリンクを貼りたい
-
会社のネットワーク上のファイ...
-
多量のファイルをフォルダに自...
-
C ファイル出力で、フォルダが...
-
保存先のフォルダ名を指定した...
-
vbsで選択ダイアログを表示した...
-
Excel VBA 同じ名前のフォルダ...
おすすめ情報