这是针对通过文件系统路径(例如/home/someuser/public_html/somedir/somefile.php
)读取的文件–我不是在谈论通过URL读取的文件。
[我发现(至少在PHP 7.1.32中)file_get_contents
可能会返回缓存的内容,而不是现在磁盘上的内容,如果文件已由外部进程(例如FTP上传)更改过。
[在我的证据记录中,文件是在9分钟前更新的,但是file_get_contents
仍返回了缓存的内容。有问题的文件是一个PHP文件,以前它本身会通过require_once
(或类似方法)由PHP本身读取,尽管(显然是由于年龄原因)对于先前的HTTP请求(尽管对于当前HTTP请求也已被“读取”)请求)。
编辑/说明:如果服务器进程发现另一个(PHP)文件已更新(即具有更新的filemtime
),则会基于另一个(PHP)文件的内容更新服务器上的文件。观察到的是,服务器进程更新的文件具有9分钟后的时间戳,但显然已根据PHP文件的较旧内容(比其当前的内容)进行了更新。
服务器环境为Linux / cPanel / Apache。已为PHP启用OPcache。
我已经做过一些研究,但我所能找到的只是comment on the PHP documentation for clearstatcache
提供了线索但没有答案:
([注意,此功能仅影响文件元数据。但是,所有PHP文件系统功能也都对自己的实际文件内容进行缓存。如果愿意,可以使用PHP.ini中的
clearstatcache
指令禁用内容缓存。默认内容缓存超时为120秒。在开发工作期间和某些类型的应用程序中,内容缓存不是一个好主意,因为您的代码可能会从刚更改了内容的文件中读取旧数据。
如果默认内容缓存超时为120秒,为什么我看到它缓存了9分钟,
realpath_cache_size = 0
中对此的实际设置是什么?
php.ini
似乎只与映射有关“相对”路径到“绝对”路径。)如何禁用对realpath_cache_size
]的特定调用实例的内容缓存(或从文件中读取的其他函数)?
[在我看来,PHP可能会内部使用其file_get_contents
缓存来确定该文件在返回其缓存内容之前显然没有被修改(即使已经修改过),尽管在我看来,这似乎太多了运行可靠。但是,这种情况很难重现,如果有人已经知道这种假设是正确的或不正确的,则可能会浪费大量精力来检验该假设。
你们中的一些人是否有一些更深入的知识,也许可以阐明一些想法?
TIA😕
这是针对通过文件系统路径(例如/home/someuser/public_html/somedir/somefile.php)读取的文件–我不是在谈论通过URL读取的文件。我发现(至少在PHP 7.1.32中)...
看来问题可能是由于在FTP上传期间保留时间戳引起的。与实际更改文件相比,服务器上的文件修改时间结束时(可能明显更长)的时间戳记。
如果服务器进程正在使用时间戳记来查看它是否需要更新其他文件,则它可以确定该文件实际上尚未更新,因此不会更新其他文件。可能导致目击者的明显行为。