Проверить файл на наличие изменений, используя php
Есть ли способ проверить, что файл доступен или изменен другим процессом из 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 ответа
Функции метаданных файла все работают stat()
output, который кэширует свои данные, так как вызов stat() является относительно дорогой функцией. Вы можете очистить этот кеш, чтобы заставить stat() получать свежие данные с помощью clearstatcache()
Существуют и другие механизмы, позволяющие отслеживать изменения файлов. Вместо выполнения цикла в PHP и повторной статистики () рассмотрите возможность использования внешнего приложения / скрипта для мониторинга, которое может подключиться к механизму, предоставляемому ОС, и вызывать ваш PHP-скрипт по требованию, когда файл действительно изменяется.
Добавлять 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
}
}