No.1
- 回答日時:
>ホームページのトップに最新の画像を自動
のためにアクセスがあるたびに毎回ファイルシステムを走査するのは
賢明ではありません。
cronあたりで定期的にチェックして、その時点での最新画像をどこかに
保持しておいて指定するのが妥当では?
なるほどそう言われてみれば・・・。
確かにアクセス毎にやらせるというのは無駄ですね。
しかし最新画像は「常に」表示させたいのです・・・。
定期的ですと新着画像があるのに古い画像が新着として出てしまっているときが
あるというのがひっかかります。
いい方法はないものでしょうか。
No.2
- 回答日時:
>いい方法はないものでしょうか。
突き放した言い方ですが、やりたければやればいいと思います。
私が言いたかったのは無駄なことはやらない方がいいというだけです。
やり方としては、opendir()してreaddir()でファイル属性を
地道にとることです。サブディレクトリについては再帰的な処理を
いれればよいでしょう。キャッシュがあるので考慮が必要です。
http://www.php.net/manual/ja/function.opendir.php
逆にアップするファイルの頻度はどうなのでしょう?
ファイルのアップ頻度が高いタイミングだけ定期処理の頻度を
あげるという手もあります。それでもやはり常に最新は担保されませんが。
逆にアップロード側で管理する手もあります。
その場合、アップローダーに最新ファイルと最新日時を更新する
コードを組み込むだけです。
ftpでのアップロードでしたら、logを検証するのも手かもしれません
アップの頻度は正直、月を通してもそんなに高くないんです(汗)
しかしどうしてもそれでやりたい次第です。
アップロード時に組み込んでおくのは名案ですね!
ただ使っているレンタルサーバーの、ブラウザからの最大アップロード容量が
2BMまでなのです。私のアップする画像は2MBを超えるものもあり、
仕方なくFTPでアップロードしております。(ちなみにロリポップです)
そうなるとlogを検証、という手なのですね。
ありがとうございます、参考にさせて頂きます。
No.3
- 回答日時:
exec ('ls -t -1 *.jpg', $output);
print "<img src=$output[0]>";
しておけばいいのではないかな?
これくらいならそんなに負荷はかからないでしょうし。
ご回答ありがとうございます。
負荷がかからないというのは素晴らしいですね!
$outputは、ディレクトリパスを入れれば宜しいのでしょうか?
調べてもいまひとつexec関数についてよく分からなくて・・・。
ちなみにPHPはド素人です。
$output = "img/";
exec ('ls -t -1 *.jpg', $output);
print "<img src=$output[0]>";
としてみた所動作できませんでした。
よろしくお願い致します。
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でも構いませんし、
アップロードしたときに自分でトリガ引いても良いですし、お好みで。
完璧に理想の状態で動作できました!素敵です!!
上書き方式も参考にさせて頂きます。ありがとうございます。
前の方のexec()を使ったやり方も凄く気になるので、
もう少し回答募集させて頂きます。
よろしくお願い致します。
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に依存する書き方は良くないとは思いますが、移植性を考える必要がなければ楽なんですよね‥‥。
ありがとうございます!できました! 最終的には
<?php
exec ('ls -t -1 img/*/*.jpg', $output);
print "<img src=$output[0]>";
?>
とする事でimgフォルダ以下のサブフォルダ含めた全てのjpgから
一番更新日時の新しいものを吐き出せるようになりました。
頂いたご意見を参考にググりましたら、exec関数について少し分かりました。
これでいかせて頂こうと思います。この度はありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) VBA 最新のフォルダ取得 1 2022/04/15 15:51
- Excel(エクセル) エクセルのマクロについて教えてください。 1 2022/10/26 17:14
- Excel(エクセル) エクセルのマクロについて教えてください。 2 2023/02/21 13:29
- Excel(エクセル) Excel VBAどこが間違ってますか? 4 2023/07/17 10:04
- Excel(エクセル) フォルダAから1つのファイルだけを、フォルダBへを移動するVBAについて 2 2022/07/25 11:45
- Excel(エクセル) Excel VBAでフォルダが何層にもなっていて最下層の中にCSVファイルがあり最上層のファイルを指 4 2022/06/08 20:41
- その他(開発・運用・管理) フォルダの中にファルダを作成してファイルを格納するバッチコマンド 1 2022/06/30 11:39
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
- Visual Basic(VBA) Excelのマクロについて教えてください。 作業フォルダ内に2つのファイルがあります。 このファイル 2 2023/07/09 13:40
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/08/08 11:02
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Windows10でコマンドプロンプト...
-
windowsでテキストファイルの各...
-
パス名に2バイト文字(マルチバ...
-
vbsで選択ダイアログを表示した...
-
Excelで指定したフォルダに保存...
-
C ファイル出力で、フォルダが...
-
META-INFフォルダの置き場所に...
-
デスクトップの画像をhtmlに表...
-
エクセル VBA ファイルをフォ...
-
ファイル名と同名のフォルダを...
-
VBA:特定の文字を含むフォルダ...
-
サーバ内のフォルダ名と各フォ...
-
VBA フォルダ名に特定の文字を...
-
エクセルのデータをメモ帳に貼...
-
フォルダ配下のファイル作成日...
-
Excel VBA 同じ名前のフォルダ...
-
保存先のフォルダ名を指定した...
-
GetAttrが原因?
-
VBA 最新のフォルダ取得
-
自動的に作られるresource.hに...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Windows10でコマンドプロンプト...
-
パス名に2バイト文字(マルチバ...
-
ファイル名と同名のフォルダを...
-
VBA 最新のフォルダ取得
-
Excelのハイパーリンクについて...
-
デスクトップの画像をhtmlに表...
-
ディレクトリ名変更してコピー...
-
VBA フォルダ名に特定の文字を...
-
バッチファイルで指定フォルダ...
-
フォルダ内のPDFファイル名を変...
-
Access VBA で フォルダ権限...
-
excelマクロ 冒頭3文字が一致す...
-
【マクロ】ファイル名の日付に...
-
フォルダにリンクを貼りたい
-
会社のネットワーク上のファイ...
-
多量のファイルをフォルダに自...
-
C ファイル出力で、フォルダが...
-
保存先のフォルダ名を指定した...
-
vbsで選択ダイアログを表示した...
-
Excel VBA 同じ名前のフォルダ...
おすすめ情報