0

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

Vip32
  • 3
  • 1
  • 2
  • Would it be bad practice to have a while loop constantly checking if the file has changed, or is this the best way to do it? – avisk Jun 23 '21 at 03:48

2 Answers2

3

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.

Marc B
  • 356,200
  • 43
  • 426
  • 500
  • In his case, his way might be better since he wants to know when it hasn't been changed recently instead of knowing when it has been changed. – Paul Jul 15 '11 at 21:47
  • @PaulPro: True, something like calling 'fuser' in linux in a loop will let you monitor active usage of the file. – Marc B Jul 15 '11 at 21:52
  • first time i asked a question on here, surprised at the speed and knowledge of everyone. everyone has the same idea. thanks again just tried it out and seems to have done the trick – Vip32 Jul 15 '11 at 22:00
0

Add clearstatcache(); to your loop:

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