opcache失效不会更新opcache状态

时间:2014-05-10 22:33:02

标签: php caching opcode

对于操作码缓存(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个文件”)语句相同!

如何重现:

  1. 安装一个大型FW应用程序(在这里使用ZF2)
  2. 将上述文件放在应用程序的webroot中
  3. 运行应用程序(500多个文件将被缓存)
  4. 运行脚本,输出类似于:
  5.   

    560 OPcache文件已清除

         

    缓存中仍有560个文件

    任何人都能解释一下吗?这些文件肯定是否已清除?

    PS。我知道上面的内容可以替换为opcache_reset(),但脚本将在下一步中过滤某个文件子集。它旨在清除单个应用程序中文件的操作码,即使在单个服务器上运行多个应用程序也是如此。重置将清除所有这些文件,这不是一个选项。

1 个答案:

答案 0 :(得分:3)

Opcache不会从内存中驱逐无效项 - 它们会一直存在,直到池已满,此时内存已完全清除。存在无效的缓存条目不会阻止PHP再次加载/编译文件。