(PHP 4, PHP 5)

clearstatcacheLimpa as informações em cache sobre arquivos


void clearstatcache ( void )

Quando você chama stat(), lstat() ou qualquer uma das funções afetadas (listadas abaixo), o PHP mantém em cache as informações que essas funções retornam para melhoria de performance. Entretanto, em certos casos você pode precisar limpar as informações cacheadas. Por exemplo, se um mesmo arquivo é verificado várias vezes em um único script, e esse arquivo corre o risco de ser apagado ou modificado durante a operação do script, você precisa limpar os dados do cache. Nesses casos, você pode utilizar a função clearstatcache() para limpar todas as informações que o PHP mantém sobre um arquivo.

Você deve notar também que o PHP não guarda informação de cache sobre arquivos que não existem. Assim, se você chamar file_exists() em um arquivo que não existe, ele irá retornar FALSE até que você crie o arquivo. Se você criar o arquivo, ele irá retornar true mesmo que você exclua o arquivo. Entretanto, unlink() limpa o cache automaticamente.


Esta função guarda infomações sobre arquivos específicos, de forma que você somente precisa chamar clearstatcache() se você estiver realizando várias operações sobre o mesmo arquivo e necessita que a informação sobre esse arquivo em particular não seja cacheada.

As funções afetadas são stat(), lstat(), file_exists(), is_writable(), is_readable(), is_executable(), is_file(), is_dir(), is_link(), filectime(), fileatime(), filemtime(), fileinode(), filegroup(), fileowner(), filesize(), filetype(), e fileperms().

Valor Retornado

Não há valor retornado.

add a note add a note

User Contributed Notes 3 notes

matt_m at me dot com
3 years ago
unlink() does not clear the cache if you are performing file_exists() on a remote file like:

if (file_exists(""))

In this case, even after you unlink() successfully, you must call clearstatcache().


file_exists() then properly returns false.
bj at wjblack dot com
10 days ago
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:

// is_dir() forces a stat call, so the cache is populated
if( is_dir($foo) ) {
system("rm -rf " . escapeshellarg($foo));
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 :-( ).
markandrewslade at gmail dot com
4 years ago
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.


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)) {
"Delete $target before running.\n");

"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.

if ((
$pid = pcntl_fork()) === -1) { die("Failed to pcntl_fork.\n"); }
elseif (
$pid === 0) {
// child
report($target, '<<child>> ');
"<<child>> Clearing stat cache.\n";
report($target, '<<child>> ');
} else {
// parent
sleep(2); // move this to the child block to reverse the test.
report($target, '<<<parent>> ');
report($target, '<<<parent>> ');

To Top