L'appel à la fonction stat() ou
lstat() est relativement coûteux en termes de
temps d'exécution. Pour cela, le résultat du dernier
appel à l'une des fonctions de statut, (voir la liste ci-dessous), est
sauvegardé pour réutilisation ultérieure. Si vous voulez
forcer la vérification du statut d'un fichier, dans le cas où le
fichier aurait pu être modifié ou aurait disparu, vous
devez utiliser la fonction clearstatcache()
afin d'effacer de la mémoire les résultats du dernier
appel à la fonction.
Sachez que PHP ne met pas en cache les informations concernant
un fichier inexistant. Si vous appelez file_exists()
sur un fichier qui n'existe pas, la fonction retournera false
jusqu'à ce que vous créiez le fichier. Si vous créez le fichier,
la fonction retournera true même si vous effacez le fichier.
Note:
Cette fonction met en cache des informations sur les fichiers.
Vous n'avez donc besoin d'appeler clearstatcache() que
si vous faites des opérations multiples sur le dossier, et que vous
voulez avoir une version récente des informations.
Not documented, but seems like clearstatcache() is clearing the cache only for the process it is being called from. I have 2 PHP scripts running simultaneously, and the first one does call clearstatcache(), but still the second one deadlocks, unless I call clearstatcache() in it too:
script1: <?php touch('system.lock'); ... unlink('system.lock'); clearstatcache(); // should be done by unlink? ?>
script2: <?php while (is_file('system.lock') { sleep(1); clearstatcache(); // without this, script 2 will deadlock forever! } ?>
Note that this function affects only file metadata. However, all the PHP file system functions do their own caching of actual file contents as well. You can use the "realpath_cache_size = 0" directive in PHP.ini to disable the content caching if you like. The default content caching timeout is 120 seconds.
Content caching is not a good idea during development work and for certain kinds of applications, since your code may read in old data from a file whose contents you have just changed.
Note: This is separate from the caching typically done by browsers for all GET requests (the majority of Web accesses) unless the HTTP headers override it. It is also separate from optional Apache server caching.
Just to make this more obvious (and so search engines find this easier):
If you do fileops of any kind outside of PHP (say via a system() call), you probably want to clear the stat cache before doing any further tests on the file/dir/whatever. For example:
<?php // is_dir() forces a stat call, so the cache is populated if( is_dir($foo) ) { system("rm -rf " . escapeshellarg($foo)); if( is_dir($foo) ) { // ...will still be true, even if the rm succeeded, because it's just // reading from cache, not re-running the stat() } } ?>
Pop a clearstatcache() after the system call and all is good (modulo a bit of a performance hit from having a cleared stat cache :-( ).