проверить файл на наличие изменений с помощью php - PullRequest
0 голосов
/ 16 июля 2011

Есть ли способ проверить, что файл доступен или изменен другим процессом из php-скрипта. Я пытался использовать функции filemtime (), fileatime () и filectime (), но у меня есть скрипт в цикле, который постоянно проверяет, но кажется, что после того, как скрипт был выполнен, это займет время только с первого раза файл был проверен .. примером будет загрузка файлов на FTP или SMB, я попытался это сделать ниже

while(1==1)
{
  $LastMod = filemtime("file");
  if(($LastMod +60) > time())
  {
    echo "file in use please wait... last modified : $LastMod";
    sleep(10);
  }else{
    process file
  }
}

Я знаю, что файл постоянно меняется, но переменная $ LastMod не обновляется, но завершает процесс и выполняет снова, получит новый $ LastMod из файла, но, похоже, что dosnt обновляется каждый раз, когда файл проверяется в цикле

Я также пытался это сделать, просматривая filesize (), но у меня были те же симптомы, что и у flock (), но поскольку файл создается или изменяется вне PHP, я не вижу, как это будет работать.

Если у кого-то есть какие-либо решения, пожалуйста, дайте мне знать

спасибо Vip32

PS. использование PHP для обработки файлов, что требует взаимодействия с MySQL и запроса внешних веб-сайтов

Ответы [ 2 ]

3 голосов
/ 16 июля 2011

Все функции метаданных файла отрабатывают stat() вывод, который кэширует свои данные, так как вызов stat () является относительно дорогой функцией.Вы можете очистить этот кеш, чтобы заставить stat () извлекать свежие данные с помощью clearstatcache()

Существуют другие механизмы, позволяющие отслеживать изменения файлов.Вместо выполнения цикла в PHP и повторной статистики () рассмотрите возможность использования внешнего приложения / скрипта для мониторинга, которое может подключиться к механизму, предоставляемому ОС, и вызывать ваш PHP-скрипт по требованию, когда файл действительно изменяется.

0 голосов
/ 16 июля 2011

Добавьте clearstatcache(); в свой цикл:

while(true)
{
  $LastMod = filemtime("file");
  clearstatcache();
  if(($LastMod +60) > time())
  {
    echo "file in use please wait... last modified : $LastMod";
    sleep(10);
  }else{
    process file
  }
}
...