【问题标题】:Opcache - Clean cache in PHP5.4 and lowerOpcache - 在 PHP5.4 及更低版本中清理缓存
【发布时间】:2013-07-17 00:01:07
【问题描述】:

在 PHP5.4 或更低版本中是否有使用 Opcache 清理/重置缓存文件的方法?
Here 是似乎仅适用于 PHP5 的 opcache_reset() 函数。 5

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

编辑:我在 Github 上打开了issue

【问题讨论】:

标签: php php-5.4 zend-optimizer opcache


【解决方案1】:

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

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

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

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

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

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

如果您想了解更多,我已经完成了此概述:The Zend Engine and opcode caching。如果您有任何反馈或问题,请在此处发表评论或在 Github 上提出问题。

【讨论】:

  • 非常感谢您的详细解释。通过创建脚本并通过 curl 运行它的解决方案有点直截了当,但感觉不太对,或者至少不像它可能的那么简单。
  • 你也可以重新加载 php-fpm,这会优雅地重启并且应该清除 opcache。
【解决方案2】:

查看您的环境中的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 中使用了这个又快又脏的 control panel(使用 opcache_* 方法)。

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

似乎尝试accelerator_*而不是opcache_*函数。

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

【讨论】:

  • 感谢您的回答!这些功能存在,但似乎没有效果。权限(哪个用户运行opcache_reset)是否起作用?
  • 好问题,我不确定。您可以尝试使用链接在您的服务器上的那个 php 脚本,看看它是否有效?最后,您使用了哪些 INI 设置?你确定它们正在生效吗? (你的缓存过期时间是多少?)
  • 使用脚本清理缓存有效。作为“www-data”运行php -r "echo function_exists('opcache_reset')?'opcache_':(function_exists('accelerator_reset')?'accelerator_':'');" 返回opcache_。我将 PHP-FPM 与 nginx 一起使用
  • 似乎链接的脚本正在做正确的事情。答案很可能在那里 - 涉水有点厚
  • 也许有“两个缓存”。每个 php 实现 (CLI/FPM) 一个。该脚本什么都不做,然后运行opcache_reset(),而是通过 PHP-FPM 实例。手动我总是尝试通过 PHP-CLI 运行命令。有没有办法通过终端通过 PHP-FPM 运行 php 命令? (部署所需)
【解决方案3】:

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

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

opcache.use_cwd=1

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    • 2012-12-09
    • 1970-01-01
    • 2014-12-16
    相关资源
    最近更新 更多