人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

以前、サーバーの更新の記録を表示させることについて

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>
ただし、ディレクトリの更新日時は、ファイルを削除しても更新されます。
あと、指定ディレクトリ内にサブディレクトリが存在する場合、そのサブディレクトリ内が更新されても、親のディレクトリの更新日時は更新されません。

というアドバイスをいただいたのですが、サブディレクトリの更新で親のディレクトリの更新日時も更新したいときはどうしたよいでしょうか。

●質問者: webster
●カテゴリ:コンピュータ インターネット
✍キーワード:BAR PHP Web アドバイス サーバ
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● kent013
●23ポイント

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));

でどうでしょうか?

ファイルが作られたり消されたりすれば,親ディレクトリの日時も変わります.

◎質問者からの返答

directory Aの下にsubdirectory BとCがあります。BとCのいずれかを更新したさいにindex.phpに更新されたと出したいのです。


2 ● kent013
●23ポイント

では,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の更新時間をとってきて、そのうちで新しいものを表示させればいいのだと思います。大変恐縮ですが、どういうすくりぷとになりますでしょうか。


3 ● kent013
●22ポイント

いちばん簡単なのは,適当なテキストファイルに時間を記録しておくことです.

<?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に入れるなり何なりして管理したほうがいいとは思います.

ダミーです.

http://a.a.com//


4 ● tobeoscontinue
●22ポイント

親ディレクトリの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を調べる必要が無くなります。こちらの方が断然、負荷は少ないです。

(競合する場合、問題があるかもしれません)

http://q.hatena.ne.jp

◎質問者からの返答

ありがとうございます!

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ