【发布时间】:2014-05-10 22:33:02
【问题描述】:
为了操作码缓存(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 的一部分)。我的问题是第一个回显(“x OPcache filescleared for web”)打印的数字与最后一个回显(“缓存中仍有x个文件”)语句相同!
如何重现:
- 安装大型固件应用程序(此处使用 ZF2)
- 将上述文件放在应用的 webroot 中
- 运行应用程序(将缓存 500 多个文件)
- 运行脚本,输出将类似于:
已清除 560 个 OPcache 文件
缓存中还有560个文件
谁能解释一下?文件是否确定清除?
PS。我知道上面的内容可以替换为opcache_reset(),但脚本将过滤某个文件子集作为下一步。它旨在清除单个应用程序中文件的操作码,即使在单个服务器上运行多个应用程序也是如此。重置将清除所有这些文件,这不是一个选项。
【问题讨论】: