file_exists()或类似函数的php缓存过期时间


php cache expiration time for file_exists() or similiar functions

根据file_exists()的php文档

此函数的结果将被缓存。请参阅clearstatcache()更多细节。

但它并没有提供php在缓存中保存这些信息的时间信息。我已经检查了clearstatcache()的文档但是没有这样的信息。谷歌搜索这次也没用。

我正在构建一个应用程序,其中调用file_exists来生成一些输出,由于任何用户都可以随时删除被检查的文件,因此在生成输出之前,我需要确定它是否真的存在。

在file_exists()之前调用clearcache()可以解决这个问题,但出于好奇,我想知道PHP将缓存文件信息多长时间(默认时间),以及通过哪个变量可以更改缓存到期时间?

编辑1:实际上,删除文件后再次使用file_exists()进行检查会返回false,但如果是这样,文档中所写的缓存的含义是什么?

编辑2:

<? 
var_dump(file_exists('/home/user/filecheck.php')); 
sleep(20);
// after running script, sleep for 20 seconds just to quickly delete this file manually before file_exists is called again.
// unlink is not used since as per documentation it'll clear php cache.
var_dump(file_exists('/home/user/filecheck.php')); 
?>

脚本的响应是

boolean true
boolean false

这意味着php不会缓存file_exists信息——如果文件存在,即使是用于相同的执行,那么为什么文档中写着"缓存此函数的结果"呢?

stat缓存将缓存信息的时间长短可以在php.ini文件中使用realpath_cache_ttl变量进行配置。默认值似乎是120秒。

您不需要clearstatcache(),因为手册中说:

您还应该注意,PHP不缓存有关不存在的文件。因此,如果您对一个不存在,在您创建文件之前,它将返回FALSE。如果你创建文件时,即使您删除了该文件,它也会返回TRUE。但是unlink()会自动清除缓存。

此外,为了避免一些错误,如果您想检查文件的存在,最好使用is_file(),检查目录的is_dir(),因为如果同时存在的路径是文件或目录,file_exists()将返回true。

p.s.,以证明如果文件被删除,它不会被缓存:http://joxi.ru/eAO55BF4ojZjmo

关于缓存的含义:再次阅读本手册:http://php.net/manual/en/function.clearstatcache.php

当您使用stat()、lstat()或中列出的任何其他函数时受影响的函数列表(如下),PHP缓存那些函数返回以提供更快的性能。

这意味着缓存是用于文件统计的,为了不每次都重读它,clearstatcache()删除了该文件的统计缓存并强制重读它们。

附言:实际上,缓存统计数据而不由用户明确启用是愚蠢的,比如:ini_set('cache_file_stats', true),最好将其控制权交给用户。