我最近转到PHP 5.4并安装了OPCache,它功能非常强大!
如何暂时禁用缓存?
我试过了:
ini_set('opcache.enable', 0);
但它没有效果。
由于
答案 0 :(得分:72)
一旦你的脚本运行,没有缓存文件为时已晚。你需要在PHP之外设置它:
如果PHP作为Apache模块运行,请使用.htaccess
文件:
php_flag opcache.enable Off
如果PHP以CGI / FastCGI身份运行,请使用.user.ini
文件:
opcache.enable=0
而且,无论如何,如果您有权访问它,可以使用旧的系统级php.ini
。
答案 1 :(得分:21)
opcache.enable是 PHP_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
并重新启动您的网络服务器。将其重新设置为=1
,并在完成后重新启动。
还要考虑(在开发上下文中)设置opcache.validate_timestamps=on
和opcache.revalidate_freq=0
。这将保持启用OPcache,但脚本将在每个编译请求上进行统计,以查看它们是否已更改。这在开发时提供了两全其美的优势。
同时阅读opcache.blacklist_filename
指令。这允许您指定排除文件,因此如果其中包含/var/www/test
,并且Web服务docroot为/var/www
,那么<{1}}层次结构中的任何脚本都不会被缓存。
希望这有帮助:)
答案 2 :(得分:0)
我发现在特定的PHP文件中禁用opcache的最佳方法是:opcache_invalidate(__FILE__, true);
您还可以使用PHP重置所有缓存:opcache_reset();
答案 3 :(得分:0)
根据我的谦虚意见,因为我不是专家,所以Jul给出了最佳答案。问题包括“临时”一词,因此更改我认为的配置文件不是最佳答案,因为您需要重新配置,运行所需的内容并再次重新配置以使其正常工作。
这不顺利。
有了Jul的答案,您可以通过禁用操作缓存来修改代码以执行某些操作,并在同一代码内恢复正常状态(尽管我们必须查看如何从操作缓存代码中重新启用代码)>
例如,对于Prestashop,如果启用了opcache,则可能会从管理界面清除“常规”缓存,因此在这种情况下,您可以使用一种方法,以便在执行操作时禁用opcache,清除“常规”缓存,然后再次启用opcache。