Search code examples
phpfile-in-use

check file for changes using php


Is there any way to check id a file is being accessed or modified by another process from a php script. i have attempted to use the filemtime(), fileatime() and filectime() functions but i have the script in a loop which is checking continuously but it seems once the script has been executed it will only take the time from the first time the file was checked.. an example would be uploading files to a FTP or SMB share i attempted this below

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

I know the file is constantly changing but the $LastMod variable is not updating but end process and execute again will pick up a new $LastMod from the file but dosnt seem to update each time the file is checked in the loop

I have also attempted this with looking at filesize() but get the same symptoms i also looked into flock() but as the file is created or modified outside PHP I don't see how this would work.

If anyone has any solutions please let me know

thanks Vip32

PS. using PHP to process the files as requires interaction with mysql and querying external websites


Solution

  • The file metadata functions all work off stat() output, which caches its data, as a stat() call is a relatively expensive function. You can empty that cache to force stat() to fetch fresh data with clearstatcache()

    There are other mechanisms that allow you to monitor for file changes. Instead of doing a loop in PHP and repeatedly stat()ing, consider using an external monitoring app/script which can hook into the OS-provided mechanism and call your PHP script on-demand when the file truly does change.