Как проверить, изменилось ли содержание каталога с PHP?

Почему бы не преобразовать строку в целое число формы YYYYMMDDHHMMSS? Каждое приращение времени создавало бы большее целое число, и вы могли бы фильтровать целые числа, а не беспокоиться о преобразовании в время ISO.

23
задан PHLAK 12 February 2009 в 07:04
поделиться

8 ответов

Эээ. Я бы просто сохранил md5 списка каталогов. Если содержимое изменится, md5 (список каталогов) изменится. Вы можете получить очень случайные столкновения md5, но я думаю, что этот шанс достаточно мал ..
В качестве альтернативы вы можете сохранить в этом каталоге небольшой файл, содержащий дату «последнего изменения». Но я бы пошел с md5.


PS. если подумать, то, видя, как вы смотрите на производительность (кеширование), запрос и хеширование списка каталогов может быть не совсем оптимальным.

6
ответ дан 29 November 2019 в 01:27
поделиться

Как уже упомянуто другими, лучший способ решить это должно было бы инициировать функцию, когда конкретные события происходят, который изменяет папку. Однако, если Ваш сервер является Unix, можно использовать inotifywait, чтобы смотреть каталог и затем вызвать Сценарий PHP.

Вот простой пример:

#!/bin/sh
inotifywait --recursive --monitor --quiet --event modify,create,delete,move --format '%f' /path/to/directory/to/watch |
  while read FILE ; do
    php /path/to/trigger.php $FILE
  done

См. также: http://linux.die.net/man/1/inotifywait

22
ответ дан troelskn 29 November 2019 в 01:27
поделиться

Что относительно касание каталог после того, как пользователь отправил свое изображение? Changelog говорит: Требует, чтобы php 5.3 для окон работал, но я думаю, что он должен работать над всеми другими средами

8
ответ дан scunliffe 29 November 2019 в 01:27
поделиться

Вот то, что можно попробовать. Сохраните все изображения в единственном каталоге (или в /username подкаталоги в нем, чтобы ускорить вещи и уменьшить напряжение на FS) и настройте Apache (или whaterver, который Вы используете) служить им в качестве статического содержания с, "истекает - на" наборе к 100 годам в будущем. Имена файлов должны содержать некоторый уникальный префикс или суффикс (метка времени, хеш SHA1 содержания файла, и т.д.), поэтому каждый раз, когда использование изменяет файл, его имя изменилось, и Apache будет служить новой версии, которая будет кэшироваться по пути.

3
ответ дан Anton Gogolev 29 November 2019 в 01:27
поделиться

Вы думаете неправильный путь.

необходимо выполнить сценарий индексатора каталога, как только кто-то загрузил новый файл, и он перемещен в целевое местоположение.

3
ответ дан SchizoDuckie 29 November 2019 в 01:27
поделиться

Попытайтесь удалить кэшированную версию, когда пользователь загрузит файл на свой каталог.

, Когда кто-то пытается просмотреть галерею, посмотрите, если существует кэшированная версия сначала. Если существует кэшированная версия, загрузите ее, иначе, генерируйте страницу, кэшируйте ее, сделанный.

1
ответ дан Mario 29 November 2019 в 01:27
поделиться

Я искал для чего-то похожего, и я только что нашел это:

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

Для меня это выглядит как отличное решение, так как у меня будет много контроля (я сделаю вызов AJAX, чтобы посмотреть, не изменится ли что-нибудь).

Надеюсь, что это поможет.

1
ответ дан 29 November 2019 в 01:27
поделиться

Ответ IMO edubem - это путь, однако, вы можете сделать что-то подобное:

if (sha1(serialize(Map('/path/to/directory/', true))) != /* previous stored hash */)
{
    // directory contents has changed
}

Или более слабая /быстрая версия:

if (Size('/path/to/directory/', true) != /* previous stored size */)
{
    // directory contents has changed
}

Вот используемые функции:

function Map($path, $recursive = false)
{
    $result = array();

    if (is_dir($path) === true)
    {
        $path = Path($path);
        $files = array_diff(scandir($path), array('.', '..'));

        foreach ($files as $file)
        {
            if (is_dir($path . $file) === true)
            {
                $result[$file] = ($recursive === true) ? Map($path . $file, $recursive) : $this->Size($path . $file, true);
            }

            else if (is_file($path . $file) === true)
            {
                $result[$file] = Size($path . $file);
            }
        }
    }

    else if (is_file($path) === true)
    {
        $result[basename($path)] = Size($path);
    }

    return $result;
}

function Size($path, $recursive = true)
{
    $result = 0;

    if (is_dir($path) === true)
    {
        $path = Path($path);
        $files = array_diff(scandir($path), array('.', '..'));

        foreach ($files as $file)
        {
            if (is_dir($path . $file) === true)
            {
                $result += ($recursive === true) ? Size($path . $file, $recursive) : 0;
            }

            else if (is_file() === true)
            {
                $result += sprintf('%u', filesize($path . $file));
            }
        }
    }

    else if (is_file($path) === true)
    {
        $result += sprintf('%u', filesize($path));
    }

    return $result;
}

function Path($path)
{
    if (file_exists($path) === true)
    {
        $path = rtrim(str_replace('\\', '/', realpath($path)), '/');

        if (is_dir($path) === true)
        {
            $path .= '/';
        }

        return $path;
    }

    return false;
}
2
ответ дан 29 November 2019 в 01:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: