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

PHPで、指定フォルダ(サブフォルダ含む)内の更新日時が一番新しいファイル名を取得したいです。
良いスクリプト記述はありますでしょうか。。。

ホームページのトップに最新の画像を自動で載せておきたいのです。
img/2005/***.jpg といった感じでimgフォルダ内に複数の年別フォルダがあり、
更にその中に画像ファイルが入っています。

どうぞ宜しくお願い致します。

A 回答 (5件)

>ホームページのトップに最新の画像を自動



のためにアクセスがあるたびに毎回ファイルシステムを走査するのは
賢明ではありません。
cronあたりで定期的にチェックして、その時点での最新画像をどこかに
保持しておいて指定するのが妥当では?
    • good
    • 0
この回答へのお礼

なるほどそう言われてみれば・・・。
確かにアクセス毎にやらせるというのは無駄ですね。
しかし最新画像は「常に」表示させたいのです・・・。
定期的ですと新着画像があるのに古い画像が新着として出てしまっているときが
あるというのがひっかかります。

いい方法はないものでしょうか。

お礼日時:2010/02/04 11:49

>いい方法はないものでしょうか。



突き放した言い方ですが、やりたければやればいいと思います。
私が言いたかったのは無駄なことはやらない方がいいというだけです。
やり方としては、opendir()してreaddir()でファイル属性を
地道にとることです。サブディレクトリについては再帰的な処理を
いれればよいでしょう。キャッシュがあるので考慮が必要です。

http://www.php.net/manual/ja/function.opendir.php

逆にアップするファイルの頻度はどうなのでしょう?
ファイルのアップ頻度が高いタイミングだけ定期処理の頻度を
あげるという手もあります。それでもやはり常に最新は担保されませんが。

逆にアップロード側で管理する手もあります。
その場合、アップローダーに最新ファイルと最新日時を更新する
コードを組み込むだけです。
ftpでのアップロードでしたら、logを検証するのも手かもしれません
    • good
    • 0
この回答へのお礼

アップの頻度は正直、月を通してもそんなに高くないんです(汗)
しかしどうしてもそれでやりたい次第です。

アップロード時に組み込んでおくのは名案ですね!
ただ使っているレンタルサーバーの、ブラウザからの最大アップロード容量が
2BMまでなのです。私のアップする画像は2MBを超えるものもあり、
仕方なくFTPでアップロードしております。(ちなみにロリポップです)
そうなるとlogを検証、という手なのですね。
ありがとうございます、参考にさせて頂きます。

お礼日時:2010/02/04 21:34

exec ('ls -t -1 *.jpg', $output);


print "<img src=$output[0]>";
しておけばいいのではないかな?
これくらいならそんなに負荷はかからないでしょうし。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
負荷がかからないというのは素晴らしいですね!

$outputは、ディレクトリパスを入れれば宜しいのでしょうか?
調べてもいまひとつexec関数についてよく分からなくて・・・。
ちなみにPHPはド素人です。

$output = "img/";
exec ('ls -t -1 *.jpg', $output);
print "<img src=$output[0]>";

としてみた所動作できませんでした。
よろしくお願い致します。

お礼日時:2010/02/04 21:45

> img/2005/***.jpg といった感じでimgフォルダ内に複数の年別フォルダがあり、


> 更にその中に画像ファイルが入っています。

この前提を元に、linuxコマンドなんぞ知らない俺がゴリ押しで書くとこうなります。
フォルダの中身を総当りで最新のファイルを抽出しているだけです。

<?
$DimYearFolder = glob("./img/*");

$new = 0;
foreach($DimYearFolder as $i => $Year) {
//print "<hr>[$i] $Year<br>";
$DimFile = glob("$Year/*.jpg");// 指定したフォルダの指定した拡張子(ここではjpg)を配列に入れる
foreach($DimFile as $j => $dat) {// 総当りで 最も 新しいファイルを 探す
$t = filemtime($dat);
if ($t > $new) { $new = $t;$NewFile = $dat; }//
//print date("y-m-d H:i:s" , $t) . " " . $dat . " " . is_dir($dat) . "<br>\n";
}
}
print "最新のファイルは これ → " . date("y-m-d H:i:s" , $new) . " " . $NewFile;
?>

ただ #1さんが言ってるように、毎回これをやるのは あまりにもスマートじゃないなぁ。と思います。

なので、トップページの画像は 特定の名前(TopImage.jpgとか)にしておいて、
最新のファイルをコピーして その名前を付けて 上書きしてやるのが良いかと思います。
copy($NewFile , "TopImage.jpg");
↑これの前に unlink("TopImage.jpg");が 必要かも。

その更新作業をするのは、cronでも構いませんし、
アップロードしたときに自分でトリガ引いても良いですし、お好みで。
    • good
    • 0
この回答へのお礼

完璧に理想の状態で動作できました!素敵です!!
上書き方式も参考にさせて頂きます。ありがとうございます。

前の方のexec()を使ったやり方も凄く気になるので、
もう少し回答募集させて頂きます。

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

お礼日時:2010/02/04 21:54

No.3です。

まさかexec関数について聞かれるとは思いませんでした。
が、説明不足だったことは認めます。
まずOSがUnix/Linux系である前提です。Windowsの場合はあとで説明します。
exec関数は第1パラメータをOSに実行させて結果をえる関数です。
"ls -t -1"で作成日時の新しい順に1行に1ファイル表示します。$outputにはその結果が配列で入り、$output[0]には出力結果の先頭行が入ります。なので$output[0]には最新の日付のファイル名が入ります。
"*.jpg"は表示するファイル名を限定する指定ですので、"*"の前にフォルダを指定しておく必要があります(判ると思って手を抜いた部分でした)。つまり、
exec ('ls -t -1 img/2005/*.jpg', $output);
print "<img src=$output[0]>";
とすれば動くと思います。

Windowsの場合lsがありませんので、
exec ('dir /b /o-d img\2005\*.jpg', $output);
print "<img src=$output[0]>";
でいいと思います。たぶん。

あまりOSに依存する書き方は良くないとは思いますが、移植性を考える必要がなければ楽なんですよね‥‥。
    • good
    • 0
この回答へのお礼

ありがとうございます!できました! 最終的には

<?php
exec ('ls -t -1 img/*/*.jpg', $output);
print "<img src=$output[0]>";
?>

とする事でimgフォルダ以下のサブフォルダ含めた全てのjpgから
一番更新日時の新しいものを吐き出せるようになりました。

頂いたご意見を参考にググりましたら、exec関数について少し分かりました。
これでいかせて頂こうと思います。この度はありがとうございました。

お礼日時:2010/02/07 03:02

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