(PHP 4, PHP 5)
clearstatcache — Löscht den Status Cache
Wenn Sie stat
, lstat
oder eine andere in der nachstehenden Liste der betroffenen Funktionen
verwenden, speichert (cached) PHP die von diesen Funktionen
zurückgeggebenen Informationen temporär, um eine bessere Performance
zu bieten. In manchen Fällen könnten Sie jedoch wollen, dass diese
zwischengespeicherten Informationen gelöscht werden. Wird z.B. die
selbe Datei innerhalb eines Skriptes mehrmals geprüft und ist es
wahrscheinlich, dass diese Datei während der Ausführung des Skriptes
gelöscht oder verändert wird, könnten Sie sich dafür entscheiden, den
Status Cache zu löschen. In solchen Fällen empfiehlt es sich, die von
PHP zwischengespeicherten Informationen über eine Datei mittels
clearstatcache() zu löschen.
Hinweis:
Diese Funktion speichert Informationen über bestimmte Dateinamen, weshalb Sie clearstatcache() nur aufrufen müssen, wenn Sie mehrere Operationen an dem selben Dateinamen durchführen, und die Informationen über genau diese Datei nicht gespeichert werden sollen.
Folgende Funktionen betreffen den Dateistatus: stat(), lstat(), file_exists(), is_writable(), is_readable(), is_executable(), is_file(), is_dir(), is_link(), filectime(), fileatime(), filemtime(), fileinode(), filegroup(), fileowner(), filesize(), filetype() und fileperms().
On Linux, a forked process inherits a copy of the parent's cache, but after forking the two caches do not impact each other. The snippet below demonstrates this by creating a child and confirming outdated (cached) information, then clearing the cache, and getting new information.
<?php
function report($directory, $prefix = '') { printf('%sDoes %s exist? PHP says "%s"'. PHP_EOL, $prefix, $directory, is_dir($directory) ? 'yes' : 'no'); }
$target = './delete-me-before-running-statcache';
if (is_dir($target)) {
die("Delete $target before running.\n");
}
echo "Creating $target.\n";
mkdir($target) || die("Unable to create $target.\n");
report($target); // is_dir($target) is now cached as true
echo "Unlinking $target.\n";
rmdir($target) || die("Unable to unlink $target.\n");
// This will say "yes", which is old (inaccurate) information.
report($target);
if (($pid = pcntl_fork()) === -1) { die("Failed to pcntl_fork.\n"); }
elseif ($pid === 0) {
// child
report($target, '<<child>> ');
echo "<<child>> Clearing stat cache.\n";
clearstatcache();
report($target, '<<child>> ');
} else {
// parent
sleep(2); // move this to the child block to reverse the test.
report($target, '<<<parent>> ');
clearstatcache();
report($target, '<<<parent>> ');
}
?>