更新资料
我解决了问题并发布了答案。但是,我的解决方案并非100%理想。我宁愿只symlink从cachewith clearstatcache(true, $target)或中删除,clearstatcache(true, $link)但那不起作用。
我还宁愿首先避免对符号链接进行缓存,也可以在生成符号链接后立即将其从缓存中删除。不幸的是,我没有运气。由于某些原因clearstatcache(true),创建符号链接后无法正常工作,但仍会对其进行缓存。
我会很高兴地将悬赏奖励给任何能够改善我的答案并解决这些问题的人。
编辑
我试图通过每次clearstatcache运行时生成一个文件来优化我的代码,因此我只需要为每个符号链接清除一次缓存。由于某些原因,这不起作用。clearstatcache每次symlink在路径中包含a时都需要调用它,但是为什么呢?必须有一种方法可以优化我拥有的解决方案。
我使用PHP 7.3.5带nginx/1.16.0。有时file_get_contents在使用时会返回错误的值symlink。问题是删除并重新创建符号链接后,其旧值保留在缓存中。有时返回正确的值,有时返回旧值。它似乎是随机的。
我试图用以下方法清除缓存或防止缓存:
function symlink1($target, $link)
{
realpath_cache_size(0);
symlink($target, $link);
//clearstatcache(true);
}
Run Code Online (Sandbox Code Playgroud)
我并不是真的想要禁用缓存,但是我仍然需要100%的file_get_contents精度。
编辑
我无法发布我的源代码,因为它太长且太复杂了,所以我创建了一个最小的,可重现的示例(index.php),该示例再次出现了问题:
<h1>Symlink Problem</h1>
<?php
$dir = getcwd();
if (isset($_POST['clear-all']))
{
$nos = array_values(array_diff(scandir($dir.'/nos'), array('..', '.')));
foreach ($nos as $no)
{
unlink($dir.'/nos/'.$no.'/id.txt');
rmdir($dir.'/nos/'.$no);
}
foreach (array_values(array_diff(scandir($dir.'/ids'), array('..', '.'))) as $id)
unlink($dir.'/ids/'.$id);
}
if …Run Code Online (Sandbox Code Playgroud) 最新版本的PHP具有文件名缓存,用于了解文件的真实路径,require_once()并且include_once()可以利用它。
您可以在php.ini中设置一个值来设置缓存的大小,但是我不知道如何确定大小。默认值为16k,但是我看不出要使用多少缓存。这些文档含糊不清:
确定PHP将使用的realpath缓存的大小。在PHP打开许多文件的系统上,应该增加该值,以反映所执行的文件操作的数量。
是的,我可以增加所允许的缓存数量,并使用ab其他测试来运行测试,但是我想要的是一些自省的功能,而不仅仅是从远处计时。