• ベストアンサー

PHPで、指定フォルダ(サブフォルダ含む)内の更新日時が一番新しいファ

PHPで、指定フォルダ(サブフォルダ含む)内の更新日時が一番新しいファイル名を取得したいです。 良いスクリプト記述はありますでしょうか。。。 ホームページのトップに最新の画像を自動で載せておきたいのです。 img/2005/***.jpg といった感じでimgフォルダ内に複数の年別フォルダがあり、 更にその中に画像ファイルが入っています。 どうぞ宜しくお願い致します。

  • PHP
  • 回答数5
  • ありがとう数6

質問者が選んだベストアンサー

  • ベストアンサー
  • ts3m-ickw
  • ベストアンサー率43% (1248/2897)
回答No.5

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に依存する書き方は良くないとは思いますが、移植性を考える必要がなければ楽なんですよね‥‥。

oktonny
質問者

お礼

ありがとうございます!できました! 最終的には <?php exec ('ls -t -1 img/*/*.jpg', $output); print "<img src=$output[0]>"; ?> とする事でimgフォルダ以下のサブフォルダ含めた全てのjpgから 一番更新日時の新しいものを吐き出せるようになりました。 頂いたご意見を参考にググりましたら、exec関数について少し分かりました。 これでいかせて頂こうと思います。この度はありがとうございました。

その他の回答 (4)

  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.4

> 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でも構いませんし、 アップロードしたときに自分でトリガ引いても良いですし、お好みで。

oktonny
質問者

お礼

完璧に理想の状態で動作できました!素敵です!! 上書き方式も参考にさせて頂きます。ありがとうございます。 前の方のexec()を使ったやり方も凄く気になるので、 もう少し回答募集させて頂きます。 よろしくお願い致します。

  • ts3m-ickw
  • ベストアンサー率43% (1248/2897)
回答No.3

exec ('ls -t -1 *.jpg', $output); print "<img src=$output[0]>"; しておけばいいのではないかな? これくらいならそんなに負荷はかからないでしょうし。

oktonny
質問者

お礼

ご回答ありがとうございます。 負荷がかからないというのは素晴らしいですね! $outputは、ディレクトリパスを入れれば宜しいのでしょうか? 調べてもいまひとつexec関数についてよく分からなくて・・・。 ちなみにPHPはド素人です。 $output = "img/"; exec ('ls -t -1 *.jpg', $output); print "<img src=$output[0]>"; としてみた所動作できませんでした。 よろしくお願い致します。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

>いい方法はないものでしょうか。 突き放した言い方ですが、やりたければやればいいと思います。 私が言いたかったのは無駄なことはやらない方がいいというだけです。 やり方としては、opendir()してreaddir()でファイル属性を 地道にとることです。サブディレクトリについては再帰的な処理を いれればよいでしょう。キャッシュがあるので考慮が必要です。 http://www.php.net/manual/ja/function.opendir.php 逆にアップするファイルの頻度はどうなのでしょう? ファイルのアップ頻度が高いタイミングだけ定期処理の頻度を あげるという手もあります。それでもやはり常に最新は担保されませんが。 逆にアップロード側で管理する手もあります。 その場合、アップローダーに最新ファイルと最新日時を更新する コードを組み込むだけです。 ftpでのアップロードでしたら、logを検証するのも手かもしれません

oktonny
質問者

お礼

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

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

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

oktonny
質問者

お礼

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

関連するQ&A

  • フォルダの更新日時

    フォルダの更新日時はどういうタイミングで更新されるのですか? フォルダの中に複数のファイルがあり、 そのうちの一つでも更新されれば、 元のフォルダの更新日時も更新されるのですか?

  • フォルダの更新日時って何?

    基本的なことが分からないのでお教えください。 Windows98SEを使っているのですが、エクスプローラでフォルダを詳細表示で表示すると更新日時が表示されますが、フォルダの更新日時ってなんでしょうか。 更新日時ということは、フォルダを更新すると変わるんだと思いますが、「フォルダを更新する」とはどのようなことでしょうか。 フォルダの中にファイルを作ると更新日時が変わるのかと思ってさっきやってみたのですが、変わりませんでした。

  • フォルダの更新日時とは

    このフォルダの中に入っているファイルのいずれかが更新された最終日時が フォルダの更新日時として表示される という認識であってますか?

  • フォルダー更新日時について

    フォルダー内のファイルを更新してもフォルダーの更新日時が変わりません。フォルダーのプロパティーから、カスタマインズで、「アイコンを変更」でアイコンを変更したときだけ日付けが変わりますが、それ以外は、新しいファイルを入れても、既存のファイルを書き換えても(そのファイルは正しい日付になります。)フォルダーの日付が以前のままで全く変わりません。考えられることは、そのフォルダーがスロットに挿入してあるSDカードの中のフォルダーであるということです。内部の例えばCドライブ内のフォルダーはきちんと更新されます。OSはwindows10です。スロットに挿入してあるSDカードの中のフォルダーで更新日時を正しく更新する方法を教えてください。

  • ファイルの更新がフォルダの更新日時に反映されま

    XPのPCです。外付HDDが2台(両方バッファロー製です)あるのですが、その内の1台がフォルダ内のファイルを更新したり、新しいファイルを作成しても更新日時が変更されません。ファイルとフォルダの更新が連動していないのです。フォルダの更新日時はそのフォルダ内のファイルを新しく作っても、またファイルを更新してもフォルダの詳細(更新日時)はフォルダ作成日時のままです。フォルダ内のファイルの更新日時は変更されています。フォルダ名を検索したり作成日時を予想して並び替えれば見つけることはできるのですが、実際、フォルダが更新日時順に▼にならないと結構不便です。 他の外付HDD・内蔵HDDはファイルとフォルダの更新は連動(反映)されます。フォルダオプションの表示の設定は同じ設定にしていると思うのですが・・・ ネットワークの共有で他のPC(W7)から同外付HDDを操作しても変わりはありません。 HDDのファイル更新をフォルダ更新に反映(連動)する方法をご存知の方は方法を教えて下さい。 よろしくお願いします。

  • 更新しやすいフォルダ構成

    サイトの性質にもよるとおもうのですが。 独学でサイトを制作しておりますので。 自分流のフォルダ構成になっています。 最初に作った時は問題ないのですが、更新を頻繁にしたり、画像やページが増えていくと、とたんに使いにくくなってしまいます。 「更新しやすいフォルダ構成」とは、一般的にどういうのでしょうか? イメージ画像はまとめるとかカテゴリー別にフォルダを訳、そのフォルダ名をイメージ画像の最初に付けるとか。 img/company_01img.jpg など 現在私は、company/img/01.jpg などのようにそれぞれのカテゴリーごとにイメージ画像は入れています。 人それぞれ違うのでしょうが、「更新しやすいフォルダ構成」があれば教えてください。お願いします。

  • ファイルは日時が更新されない?

    自分のPCで作成したデータを、バックアップサーバに保存するときに、あれ?と思ったので質問です。 ・フォルダに、いくつかのファイルが入っている ・フォルダをPCとバックアップサーバに保管し、常に同じファイルが二つ存在するようにする ・フォルダ内にあるひとつのファイルを修正→ファイルの更新日時が反映 ・フォルダの日時は、中のファイルが更新されているのに、ファイル作成時のまま フォルダごと更新するときに、フォルダの更新日時が中のファイルを更新するたびに連動すれば、どちらが新しい最新のデータかわかるのに、なぜ、フォルダの日時は作成時のままなんでしょうか。 バックアップを取る際に、毎日やっていれば問題ないですが、たくさんのファイルを管理している中で、いちいちフォルダの中をあけてファイルの更新日時を比較するのは面倒です。 みなさん、どのように対応していらっしゃいますか?

  • phpで自分自身の更新日時を書き換える

    phpでファイルへアクセスがあった際に、自分自身の更新日時を、現在の日時に書き換えたいのですが、うまくいきません。以下のソースを</body>タグの前に入れてますが、ダメです。 どうしたらいいでしょうか。 <?php $fn=str_replace("/","",$_SERVER['SCRIPT_NAME']); $tm=time(); touch($fn,$tm); ?>

    • ベストアンサー
    • PHP
  • 最新の更新日時を取得したい

    RedHatLinux7.0です。シェル(bash)からサブディレクトリを含め最新の更新ファイルのファイル名とパスとその日時を得たいのですがその方法がわかりません。たとえば、、 ls -Rlt /home/dareka/public_html とするとサブディレクトリ毎に新しい順に並べてくれるのですが、欲しいのはこれらのファイルのうち最新のファイル名を一つだけとその日時とパスを知りたいのです。このような結果を得るコマンドはありますか?

  • 作成日時より更新日時のほうが古いのですが

    作成日時より更新日時のほうが古いのですが、なぜですか? あり得ない気がするのですが・・・ テキストファイルです。 フォルダの中身の画像です。

専門家に質問してみよう