26

私はPHPでフォトギャラリースクリプトを作成しており、ユーザーが写真を保存する単一のディレクトリがあります。ページキャッシュを設定し、ディレクトリの内容が変更された場合にのみキャッシュを更新しようとしています。filemtime()関数を使用してディレクトリの最終変更時刻をキャッシュし、それをディレクトリの現在の変更時刻と比較することで、これを実行できると思いました。ただし、私が気付いたように、ディレクトリの変更時間は、ファイルがそのディレクトリに追加または削除されても変更されません(少なくとも、Windowsでは、Linuxマシンについてはまだわかりません)。

だから私の質問は、ディレクトリの内容が変更されているかどうかを確認する最も簡単な方法は何ですか?

4

10 に答える 10

8

ユーザーが自分の画像を送信した後にディレクトリにアクセスするのはどうですか? 変更ログには次のように書かれています: Windows が動作するには php 5.3 が必要ですが、他のすべての環境では動作するはずだと思います

于 2009-02-12T10:25:00.410 に答える
7

PHP内のinotifywaitを使用

$watchedDir = 'watch';

$in = popen("inotifywait --monitor --quiet --format '%e %f' --event create,moved_to '$watchedDir'", 'r');
if ($in === false)
    throw new Exception ('fail start notify');

while (($line = fgets($in)) !== false) 
{
    list($event, $file) = explode(' ', rtrim($line, PHP_EOL), 2);
    echo "$event $file\n";
}
于 2011-07-20T20:12:56.503 に答える
6

うーん。ディレクトリリストの md5 を保存するだけです。内容が変わればmd5(ディレクトリ一覧)も変わります。非常にまれに md5 のクラッシュが発生する可能性がありますが、その可能性は十分に小さいと思います。
または、「最終更新日」を含む小さなファイルをそのディレクトリに保存することもできます。しかし、私はmd5で行きます。


PS。ディレクトリ リストの要求とハッシュのパフォーマンス (キャッシュ) をどのように見ているかを見て、再考すると、完全に最適ではない可能性があります..

于 2009-06-25T21:26:25.577 に答える
3

これがあなたが試すかもしれないことです。すべての画像を単一のディレクトリ(またはその中の/usernameサブディレクトリに保存して、処理を高速化し、FSへのストレスを軽減します)し、Apache(または使用しているもの)を設定して、「有効期限が切れた」静的コンテンツとして提供します将来的には100年に設定されます。ファイル名には一意のプレフィックスまたはサフィックス(タイムスタンプ、ファイルコンテンツのSHA1ハッシュなど)が含まれている必要があるため、ファイルを使用するたびにファイル名が変更され、Apacheは新しいバージョンを提供します。これは途中でキャッシュされます。

于 2009-02-12T07:28:03.550 に答える
3

あなたは間違った方法を考えています。

誰かが新しいファイルをアップロードしてターゲットの場所に移動したら、すぐにディレクトリ インデクサー スクリプトを実行する必要があります。

于 2009-02-12T08:10:35.600 に答える
1

ユーザーが自分のディレクトリにファイルをアップロードするときに、キャッシュされたバージョンを削除してみてください。

誰かがギャラリーを表示しようとすると、最初にキャッシュされたバージョンがあるかどうかを確認します。キャッシュされたバージョンがある場合はそれをロードし、そうでない場合はページを生成してキャッシュし、完了します。

于 2009-02-12T11:50:45.680 に答える
1

ディレクトリが変更された場合に 0 を返すコード サンプルを次に示します。バックアップで使用しています。

変更されたステータスは、ファイルの存在とそのファイル サイズによって決まります。これを簡単に変更して、置き換えてファイルの内容を比較できます

$longString .= filesize($file);

$longString .= crc32(file_get_contents($file));

ただし、実行速度に影響します。

#!/usr/bin/php
<?php

$dirName = $argv[1];
$basePath = '/var/www/vhosts/majestichorseporn.com/web/';
$dataFile = './backup_dir_if_changed.dat';

# startup checks
if (!is_writable($dataFile))
    die($dataFile . ' is not writable!');

if (!is_dir($basePath . $dirName))
    die($basePath . $dirName . ' is not a directory');

$dataFileContent = file_get_contents($dataFile);
$data = @unserialize($dataFileContent);
if ($data === false)
    $data = array();

# find all files ang concatenate their sizes to calculate crc32
$files = glob($basePath . $dirName . '/*', GLOB_BRACE);

$longString = '';
foreach ($files as $file) {
    $longString .= filesize($file);
}
$longStringHash = crc32($longString);

# do changed check
if (isset ($data[$dirName]) && $data[$dirName] == $longStringHash)
    die('Directory did not change.');

# save hash do DB
$data[$dirName] = $longStringHash;

file_put_contents($dataFile, serialize($data));
die('0');
于 2013-11-09T08:20:32.083 に答える
1

私は似たようなものを探していましたが、これを見つけました:

http://www.franzone.com/2008/06/05/php-script-to-monitor-ftp-directory-changes/

私は多くの制御ができるので、私にとっては素晴らしい解決策のように見えます (何かが変更されたかどうかを確認するために AJAX 呼び出しを行います)。

これが役立つことを願っています。

于 2009-12-13T09:01:46.267 に答える