临时禁用OPCache

52

我最近升级到了PHP 5.4并安装了OPCache,它非常强大!

我该如何暂时禁用缓存?

我尝试过:

 ini_set('opcache.enable', 0);

但是它没有影响。

谢谢。

4个回答

99

脚本运行后,不缓存文件已经太晚了。您需要在PHP之外进行设置:

  • 如果PHP作为Apache模块运行,请使用.htaccess文件:

    php_flag opcache.enable Off
    
  • 如果 PHP 运行为 CGI/FastCGI,则使用 .user.ini 文件:

    opcache.enable=0
    

在所有情况下,如果您可以访问,也可以使用老旧的全局php.ini系统文件。


2
只是一点提示:对于命令行 PHP 脚本,还有一个 opcache.enable_cli 选项。 - Ikar Pohorský
2
我不得不将 php_flag 更改为 php_value(Ubuntu)。 - dev101
@dev101 很奇怪,因为它明确地在文档中标记为布尔值 :-? - Álvaro González
嗯,很奇怪,第一次检查时缓存仍然处于活动状态,现在它正在工作。可能是我误触了旁边的错误书签。 - dev101

28

opcache.enablePHP_INI_ALL,这意味着ini_set()可以工作,但仅适用于当前请求以禁用OPcache缓存的剩余脚本。 (您无法强制启用)。 对于其他请求,它会恢复为系统默认设置。 在此阶段,请求脚本已经被缓存,除非您在auto_prepend_file脚本中执行ini_set。

系统默认值(PHP_INI_SYSTEM)是作为PHP系统启动的一部分锁定的,并且无法重新读取。 因此,在Apache等情况下,您需要重新启动Apache才能更改/重新加载这些内容。

.htaccess php_flag指令仅适用于运行mod_php或等效内容的情况。 它们和.user.ini文件是PHP_INI_PERDIR,这也将在请求激活时被锁定。

现在回答您可能正在问的问题。 如果您有开发系统,则最简单的方法是在适当的INI文件中设置opcache.enable = 0,然后重新启动Web服务器。 完成后,请将其设置回= 1,然后再次重新启动。

还要考虑(在开发上下文中)设置opcache.validate_timestamps = onopcache.revalidate_freq = 0。 这将保持OPcache启用,但脚本将在每个编译请求上进行状态检查以查看它们是否更改。 在开发时,这既可以得到最佳效果。

还要阅读一下opcache.blacklist_filename指令。这将允许您指定一个排除文件,因此如果其中包含/var/www/test,并且Web服务文档根目录是/var/www,则任何位于/var/www/test*层次结构中的脚本都不会被缓存。


有没有一种方法可以黑名单web_path,而不是文件名?例如,在Laravel中,整个应用程序只有一个“bootstrap”PHP文件。 - pilat
1
@pilat 不行。黑名单是基于任何被require或autoload的文件的完整解析文件名,而不是符号文件名。由于在像CMS或wiki这样的复杂应用程序中,一个URI通常会加载约100个模块/文件,因此使用“web path”是毫无意义的。 - TerryE
如果我理解正确的话,您只能在 .user.ini 文件中禁用而不能启用。 - robsch

14

在我个人的情况下,禁用特定PHP文件中的opcache最好的方法是:opcache_invalidate(__FILE__, true);

您还可以使用PHP重置所有缓存:opcache_reset();


1
在我谦虚的意见中,因为我不是专家,Jul 给出了最好的答案。问题包括“暂时”一词,所以我认为改变配置文件并不是最好的答案,因为你需要重新配置、运行你想要的东西,然后再重新配置才能使其正常工作。
这不太顺畅。
通过 Jul 的答案,你可以修改代码以通过禁用 opcache 执行某些操作,并在同一代码中返回到正常状态(尽管我们需要看看如何从代码中重新启用 opcache)。
例如,在 Prestashop 中,如果启用了 opcache,则可能会出现从管理界面清除“正常”缓存的问题,因此在这种情况下,你可以使用一种方法,使得当执行操作时,opcache 被禁用,清除“正常”缓存,然后再次启用 opcache。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接