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

问题描述 投票:0回答:3

根据 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信息,那么为什么文档中会写“缓存此函数的结果”?

php
3个回答
1
投票

可以使用 realpath_cache_ttl 变量在 php.ini 文件中配置统计缓存将缓存信息的时间。默认好像是 120 秒。


0
投票

您不需要

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)
最好将其控制权交给用户。


0
投票

因为这个问题只是作为评论得到了准确的回答......

PHP 在请求期间缓存该信息

- 马克·贝克,2016-04-30

由于目前无法禁用统计缓存,这意味着如果您有一个长时间运行的脚本或从 CLI 中执行代码,缓存将永远不会过期,并且您需要手动清除它以进行任何函数调用哪个使用它。这是低效的。

这是一个 PR,其中包含禁用缓存的功能请求(我同意!):

https://github.com/php/php-src/pull/5894

© www.soinside.com 2019 - 2024. All rights reserved.