【发布时间】:2014-02-28 15:43:57
【问题描述】:
我最近迁移到 PHP 5.4 并安装了 OPCache,它非常强大!
如何暂时禁用缓存?
我试过了:
ini_set('opcache.enable', 0);
但是没有效果。
谢谢
【问题讨论】:
我最近迁移到 PHP 5.4 并安装了 OPCache,它非常强大!
如何暂时禁用缓存?
我试过了:
ini_set('opcache.enable', 0);
但是没有效果。
谢谢
【问题讨论】:
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,则不会缓存 /var/www/test* 层次结构中的 任何 脚本。
【讨论】:
在我看来,因为我不是专家,所以 Jul 给出了最好的答案。该问题包括“临时”一词,因此更改配置文件我认为...不是最佳答案,因为您需要重新配置,运行所需的内容并再次重新配置以使其正常工作。
不流畅。
有了 Jul 的回答,您可以通过禁用 opcache 来修改代码以执行某些操作,并在同一代码中返回正常情况(尽管我们必须看看如何从代码中重新启用 opcache)
例如,在 Prestashop 中,如果启用 opcache,则从管理界面清除“正常”缓存可能会出现问题,因此在这种情况下,您可以使用一种方法,以便在执行操作时禁用 opcache, “正常”缓存被清除,然后再次启用 opcache。
【讨论】:
我发现在特定 PHP 文件中禁用 opcache 的最佳方法是:opcache_invalidate(__FILE__, true);
您也可以使用 PHP 重置所有缓存:opcache_reset();
【讨论】:
脚本运行后,再不缓存文件就太晚了。您需要在 PHP 之外进行设置:
如果 PHP 作为 Apache 模块运行,请使用 .htaccess 文件:
php_flag opcache.enable Off
如果 PHP 作为 CGI/FastCGI 运行,请使用 .user.ini 文件:
opcache.enable=0
而且,无论如何,如果您有权访问它,您可以使用旧的系统范围内的 php.ini。
【讨论】:
opcache.enable_cli 选项。