Opcache - 清理 PHP5.4 及更低版本中的缓存


Opcache - Clean cache in PHP5.4 and lower

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

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

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

zend_accelerator_module.c 声明了两个记录的 API 调用:opcache_reset()opcache_invalidate() 以及两个未记录的调用: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。 然后,进程管理器分叉为请求提供服务的子进程,并顺便从父进程继承 mmap 区域。

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

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

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

查看该方法是否可用于您的环境中的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。

它似乎尝试accelerator_*而不是opcache_*功能。

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

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

关于运行同一CMS

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

opcache.use_cwd=1

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