该函数的结果被缓存。请参阅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信息,那么为什么文档中会写“缓存此函数的结果”?
可以使用 realpath_cache_ttl 变量在 php.ini 文件中配置统计缓存将缓存信息的时间。默认好像是 120 秒。
您不需要
clearstatcache()
,因为在手册中说:
您还应该注意 PHP 不会缓存以下信息 不存在的文件。因此,如果您对一个文件调用 file_exists() 不存在,它将返回 FALSE,直到您创建该文件。如果你 创建文件后,即使您随后删除该文件,它也会返回 TRUE。 然而 unlink() 会自动清除缓存。
还要避免一些错误,如果您想检查文件是否存在,最好使用
is_file()
并检查目录是否存在 is_dir()
,因为如果存在的路径是文件还是目录,file_exists()
将返回 true。
附注证明如果文件被删除,它不会被缓存:http://joxi.ru/eAO55BF4ojZjmo
关于缓存的含义:再次阅读本手册:http://php.net/manual/en/function.clearstatcache.php
当您使用 stat()、lstat() 或 中列出的任何其他函数时 受影响的函数列表(如下),PHP 缓存这些信息 函数返回以提供更快的性能。
这意味着缓存用于文件统计信息,以免每次都重新读取它,
clearstatcache()
删除该文件的统计缓存并强制重新读取它们。
附注实际上,在用户没有明确启用统计信息的情况下缓存统计信息是愚蠢的,例如:
ini_set('cache_file_stats', true)
最好将其控制权交给用户。
因为这个问题只是作为评论得到了准确的回答......
PHP 在请求期间缓存该信息
- 马克·贝克,2016-04-30
由于目前无法禁用统计缓存,这意味着如果您有一个长时间运行的脚本或从 CLI 中执行代码,缓存将永远不会过期,并且您需要手动清除它以进行任何函数调用哪个使用它。这是低效的。
这是一个 PR,其中包含禁用缓存的功能请求(我同意!):