【问题标题】:opcache invalidation does not update opcache statusopcache 失效不会更新 opcache 状态
【发布时间】: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个文件”)语句相同!

如何重现:

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

已清除 560 个 OPcache 文件

缓存中还有560个文件

谁能解释一下?文件是否确定清除?

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

【问题讨论】:

    标签: php caching opcode


    【解决方案1】:

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

    【讨论】:

    • 感谢您的快速回复。 “他们一直呆在那里直到池已满,此时内存被完全清除”是否意味着旧项目留在内存中,将保持在那里无所事事,当这个过程最终达到内存限制时,它将刷新完整的内存所有“有效”的物品都消失了吗?换句话说;也许这对于清除缓存子集(即服务器上的单个应用程序)的缓存根本不是一个好主意?
    • 是的,就是这个意思。对于大多数网站来说,内存相对便宜,只要您不经常部署或没有基础设施来切换服务器进出/按下缓存,这不是问题。但这并不是对每个人都适用的——如果这适用于你,那么你最好还是使用 apc
    • 现在想知道,如果我使文件 foo.php 无效,然后重新加载 foo.php 以便它再次被缓存,它是否会被放置在 foo.php 之前所在位置的内存中,或者它是否需要另一个opcache中的“插槽”?而且,有没有更多关于这方面的背景信息,我可以找到工人(希望不阅读源代码,我猜这会很困难)。
    • 你为什么不试试看呢? (我相信它会使用更多的插槽)当我开始查看 Zend opcache 时,源代码是唯一的文档,现在 php 网站上有部分文档,但覆盖范围远非全面。
    猜你喜欢
    • 1970-01-01
    • 2014-10-25
    • 2015-10-25
    • 2021-03-09
    • 2014-09-06
    • 2017-01-05
    • 2019-02-21
    • 2018-03-10
    • 1970-01-01
    相关资源
    最近更新 更多