Webサーバでphpが使用できるなら、filemtime( )でディレクトリの更新日時を取得できます。
<html>
<body>
<ul>
<li><a href="foo">foo</a>
update:
<?php echo date("Y/m/d H:i:s\n", filemtime("foo")); ?>
</li>
<li><a href="bar">bar</a>
update:
<?php echo date("Y/m/d H:i:s\n", filemtime("bar")); ?>
</li>
</ul>
</body>
</html>
ただし、ディレクトリの更新日時は、ファイルを削除しても更新されます。
あと、指定ディレクトリ内にサブディレクトリが存在する場合、そのサブディレクトリ内が更新されても、親のディレクトリの更新日時は更新されません。
というアドバイスをいただいたのですが、サブディレクトリの更新で親のディレクトリの更新日時も更新したいときはどうしたよいでしょうか。
http://php.net/manual/ja/function.touch.php
touchで行けると思います.
[ishitoya@sv touchtest]$ mkdir test
[ishitoya@sv touchtest]$ ls -la
合計 12
drwxrwxr-x 3 ishitoya ishitoya 4096 1月 23 01:05 .
drwxrwxr-x 11 ishitoya ishitoya 4096 1月 23 01:05 ..
drwxrwxr-x 2 ishitoya ishitoya 4096 1月 23 01:05 test
[ishitoya@sv touchtest]$ php -r "touch(test);"
[ishitoya@sv touchtest]$ ls -la
合計 12
drwxrwxr-x 3 ishitoya ishitoya 4096 1月 23 01:06 .
drwxrwxr-x 11 ishitoya ishitoya 4096 1月 23 01:05 ..
drwxrwxr-x 2 ishitoya ishitoya 4096 1月 23 01:07 test
親ファイルのみなら
$file = "/home/moge/filename";
touch(dirname($file));
でどうでしょうか?
ファイルが作られたり消されたりすれば,親ディレクトリの日時も変わります.
では,globしてfilemtimeではどうでしょうか.
http://php.net/manual/ja/function.glob.php
ただ,更新された,ということを知るためには以前の更新日時を記憶しておく必要がありますが,そのロジックはあるのでしょうか?
. |-- A |-- B `-- C
こういうディレクトリ構成で,
<?php $subdirectories = array(); foreach(glob("A/*") as $subdirectory){ $subdirectories[$subdirectory] = filemtime($subdirectory); } var_dump($subdirectories); touch("A/C"); foreach($subdirectories as $subdirectory => $modifiedTime){ $currentModifiedTime = filemtime($subdirectory); if($modifiedTime != $currentModifiedTime){ echo "時間が更新されています.$subdirectory\n"; } } ?>
というスクリプトを動かすと
array(2) { ["A/B"]=> int(1264187785) ["A/C"]=> int(1264188220) } 時間が更新されています.A/C
という出力が得られます.
全く見当違いなら,ポイントいりません.
いやそのとおりで、BとCの更新時間をとってきて、そのうちで新しいものを表示させればいいのだと思います。大変恐縮ですが、どういうすくりぷとになりますでしょうか。
いちばん簡単なのは,適当なテキストファイルに時間を記録しておくことです.
<?php $separator = '$%$%$'; $filename = "filemtimes"; $subdirectories = array(); if(file_exists($filename)){ $file = file($filename); foreach($file as $line){ $line = trim($line); $data = explode($separator, $line); if(count($data) != 2){ continue; } $subdirectories[$data[0]] = $data[1]; } } var_dump($subdirectories); touch("A/C"); mkdir("A/D"); foreach(glob("A/*") as $subdirectory){ $currentModifiedTime = filemtime($subdirectory); if(isset($subdirectories[$subdirectory]) == false){ echo "ファイルが追加されました.$subdirectory\n"; }else if($currentModifiedTime != $subdirectories[$subdirectory]){ echo "時間が更新されています.$subdirectory\n"; } $subdirectories[$subdirectory] = $currentModifiedTime; } $output = array(); foreach($subdirectories as $subdirectory => $modifiedTime){ $output[] = $subdirectory . $separator . $modifiedTime; } file_put_contents($filename, implode("\n", $output)); ?>
というスクリプトで
array(2) { ["A/B"]=> string(10) "1264187785" ["A/C"]=> string(10) "1264229098" } 時間が更新されています.A/C ファイルが追加されました.A/D
という出力が得られます.
でも,本当はチャンとDBに入れるなり何なりして管理したほうがいいとは思います.
ダミーです.
親ディレクトリのmtimeとサブディレクトリのmtimeとの比較を繰り返してより新しい(大きい)値を返す関数dirmtime
<?php function dirmtime($path, $level=3) { $mtime = filemtime($path); if (0 < $level--) { foreach (glob($path."/*") as $file) { if (is_dir($file)) { $subtime = dirmtime($file, $level); if ($mtime < $subtime) { $mtime = $subtime; // echo $level.' '.$file."\n"; } } } } return $mtime; } ?>
まず$mtime = filemtime($path);で親ディレクトリのmtimeを入手します。
親ディレクトリ内のファイルやディレクトリはglobで配列として入手できますので
foreachで回してis_dir()でディレクトリかどうかを調べます。
ディレクトリなら同じく再帰的にdirmtimeでmtimeを入手します。
入手したmtimeが既存のmtimeより新しい(大きい)なら入れ換えます。
全てについて調べれば親ディレクトリ内の中で一番新しいmtimeが分かります。
$levelはディレクトリの階層が深いと時間がかかるので途中で止めるためのもの。
<?php echo date("Y/m/d H:i:s\n", dirmtime("foo")); ?>
更新があった場合に共通のファイル(例えば:SCRIPT_ROOT.'last_update')をtouchするようにできればindex.htmlでは
<?php echo date("Y/m/d H:i:s\n", filemtime(SCRIPT_ROOT.'last_update')); ?>
で更新日時が入手できるのでディレクトリのmtimeを調べる必要が無くなります。こちらの方が断然、負荷は少ないです。
(競合する場合、問題があるかもしれません)
ありがとうございます!
directory Aの下にsubdirectory BとCがあります。BとCのいずれかを更新したさいにindex.phpに更新されたと出したいのです。