1

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

1
  • 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? Commented Jun 23, 2021 at 3:48

2 Answers 2

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.

Sign up to request clarification or add additional context in comments.

3 Comments

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.
@PaulPro: True, something like calling 'fuser' in linux in a loop will let you monitor active usage of the file.
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
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 } } 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.