对于操作码缓存(php 5.5)失效,我写了一个小脚本。但是,状态确实告诉我失效失败。这是怎么发生的?
<?php
$scripts = opcache_get_status(true)["scripts"];
$failures = array();
foreach (array_keys($scripts) as $file) {
$result = opcache_invalidate($file, true);
if (!$result) $failures[] = $file;
}
if(count($failures) !== 0) {
exit("Failed to clear OPcache for files " . implode(", ", $failures));
}
echo sprintf("%s OPcache files cleared\n", count($scripts));
$scripts = opcache_get_status(true)["scripts"];
echo sprintf("There are still %s files in the cache", count($scripts));
现在它是一个非常简单的脚本(它将成为Soflomo\Cache的一部分)。我的问题是第一个echo(“x OPcache files为web清除”)打印的数字与最后一个echo(“缓存中仍有x个文件”)语句相同!
如何重现:
560 OPcache文件已清除
缓存中仍有560个文件
任何人都能解释一下吗?这些文件肯定是否已清除?
PS。我知道上面的内容可以替换为opcache_reset()
,但脚本将在下一步中过滤某个文件子集。它旨在清除单个应用程序中文件的操作码,即使在单个服务器上运行多个应用程序也是如此。重置将清除所有这些文件,这不是一个选项。
答案 0 :(得分:3)
Opcache不会从内存中驱逐无效项 - 它们会一直存在,直到池已满,此时内存已完全清除。存在无效的缓存条目不会阻止PHP再次加载/编译文件。