6

有没有办法使用PHP5.4 或更低版本的 Opcache 清理/重置缓存文件?
opcache_reset()似乎只适用于 PHP5.5的函数

解决方法是重新启动...

编辑:我在 Github 上打开了一个问题

4

3 回答 3

11

zend_accelerator_module.c声明了两个记录在案的 API 调用:opcache_reset()opcache_invalidate()以及两个未记录的API 调用:opcache_get_status()opcache_get_configuration()。他们所做的事情从源头上就很明显了。

当您发出时,opcache_reset()它显然只适用于连接到执行 PHP 脚本的进程的 OPcache 缓存。是的,您可以在系统上拥有许多这样的缓存。

当你opcache.enable_cli=1在一个php-cli请求时,OPcache 会为连接到该进程的缓存发出一个重启请求;不幸的是,cli SAPI 创建了一个私有缓存,所以这并没有多大用处。

在 *nix 系统上要理解的要点是 OPcache 依赖于一些底层进程管理器,例如 Apache 或 FPM 来启动 OPcache,导致它到mmap()包含缓存的 SMA。然后,进程管理器分叉出服务请求的子进程,并且顺便从父进程继承映射区域。

因此,如果要重置连接到 PHP-FPM 的 OPcache 缓存,则必须通过在 PHP-FPM 服务下运行的脚本来执行此操作。这只需要是一个 4-liner。如果您想从命令行执行此操作,则可以使用 wget、curl 或使用 curl 扩展的 PHP CLI 脚本来启动此 FPM 脚本。

但请记住在两者之间使用一些强大的身份验证机制来防止第三方利用。

如果您想了解更多,我已经完成了这个概述:Zend 引擎和操作码缓存。如果您有任何反馈或问题,请在此处发表评论或在 Github 上提出问题。

于 2013-07-19T18:23:10.163 回答
0

查看您的环境中的function_exists是否可以使用该方法。

if( function_exists('opcache_reset') ) echo 'yay!';

虽然它在 PHP5.5 中可用,因为 opcache 附带它,但如果您已将 OpCache 安装到旧版本的 php 中,它也应该可用。我相信这就是文档在说 PHP 时所指出的(PHP 5 >= 5.5.0, PECL ZendOpcache >= 7.0.0)

我还成功地在 PHP 5.4 中使用了这个快速而肮脏的控制面板(使用 opcache_* 方法)。

编辑 查看上面链接的控制面板后,我注意到它检查 PHP 版本以及 opcache_reset 是否存在。

似乎尝试加速器_ *而不是opcache_*函数。

我建议尝试该脚本以查看它是否适合您,然后我们可以向后工作以查看您的服务器上究竟安装了什么以及使用什么方法。

于 2013-07-18T11:50:08.260 回答
0

如果您的服务器上有 WordPress 站点,只需安装插件 OPcache Dashboard。它为您提供交互式控制,并在自动 Wordpress 升级过程运行后触发缓存重置。

关于运行同一 CMS 的多个实例的服务器要注意的另一件事是,如果它们运行不同版本的 CMS 或插件会发生什么。例如,如果您错开主要版本的升级,就会发生这种情况。在这种情况下,您的 PHP.ini 需要包含

opcache.use_cwd=1

所以相同的文件名将根据它所在的目录单独编译。如果你确定你的 CMS 版本在所有站点上都是相同的,你可以将它设置为 0 并获得效率提升,因为 OpCache 将编译每个例程一次,然后为它服务您服务器上的所有 CMS 实例。这也是内存效率的提升,如果您的 WP 场上有大量实例,这将非常重要。

于 2015-05-03T23:27:14.853 回答