Zend OPCache - opcache.enable_cli 1还是0?它有什么作用?

Jac*_*ack 28 php zend-cache opcache php-5.5

在文档中,它说"主要用于调试",这会让我觉得"除非你遇到问题并且需要做一些调试,否则永远不会启用它",但是阅读大部分我能找到的关于它的内容都说"启用它"opcache .enable_cli 1"但为什么?我找不到有关此事的任何信息,所以如果有人知道,如果文档基本上说保持0,我为什么要启用它?

dus*_*uff 32

丢开.它主要用于调试OPcache本身的问题.

opcache.enable_cli从命令行运行PHP脚本时,该选项启用PHP OPcache(使用php命令).但是,请记住,对于PHP 5.x,OPcache扩展通过将缓存的操作码存储在当前进程的内存中来工作.这仅在运行PHP的进程将处理可以重用这些操作码的多个请求时有用,例如在Web服务器或FastCGI中.对于像PHP CLI这样运行一个"请求"并退出的进程,它只会浪费内存和时间.

  • 使用opcache现在提供的基于文件的缓存,这个答案不再是最新的. (8认同)
  • @duskwuff:我刚刚在PHP7中添加了一个引用这个新功能的答案,其中启用enable_cli以及新的文件缓存选项是有意义的. (3认同)
  • @duskwuff:enable_cli=1 对某些库(例如 Symfony/Doctrine)有巨大影响,这些库将缓存存储在 php 文件中,并在脚本执行期间多次包含这些文件。我使用 enable_cli=1 将 CPU 使用率降低了 20-40%。 (2认同)

iqu*_*ito 31

使用PHP7和基于文件的缓存,现在可以为CLI启用opcache.最好的可能是为CLI配置一个单独的php.ini,配置如下:

opcache.enable=1
opcache.enable_cli=1
opcache.file_cache="/tmp/php-file-cache"
opcache.file_cache_only=1
opcache.file_cache_consistency_checks=1
Run Code Online (Sandbox Code Playgroud)

opcache.file_cache_only=1确保禁用内存中的opcache并且仅使用文件,这是您想要的CLI.这应该会大大增加执行时间.

在用于FPM的php.ini中,您将需要使用相同的设置opcache.file_cache_only=0,因此使用内存中的opcache并将文件缓存用作回退(这也使FPM更快,因为文件缓存减少了预热时间重启FPM或重置opcache,因为缓存的文件仍然存在).

这样,CLI和FPM共享文件缓存,FPM将内存缓存作为第二个primpary缓存以获得最大速度.PHP7的一大改进!只需确保选择opcache.file_cacheCLI和FPM都可以写入的目录,并且同一个用户进行写入/读取.

2017年更新

我不建议再使用FPM文件缓存(仅用于CLI),因为在设置时无法重置缓存opcache.validate_timestamps=0- 文件缓存会阻止PHP-FPM识别任何更改,因为opcache_reset()甚至是完整的PHP -FPM重新启动不会影响文件缓存,并且文件缓存没有等效项,因此永远不会注意到更改的脚本.我在2016年3月将此报告为" 错误 "/" 功能请求 ",但目前这不是一个问题.请注意,如果你使用opcache.validate_timestamps=0!

  • 使用差异令人难以置信,在设置 CLI 以使用它之前,我有一个脚本可以通过 IMAP 下载电子邮件,该脚本一次可以 100% 停留几秒钟,但现在它从未达到 30% (2认同)
  • @iquito 我发现事情并不像看起来那么可怕。很有可能进行原子部署,我已经在[此处](https://www.getpagespeed.com/server-setup/php/zend-opcache#file_cache_cleaning)编写了它。本质上,“mv”或“rm”是基于文件的 OPCache 目录*本身*,而不是部署期间的内容。这将使其无法用于 PHP 进程(因为它不喜欢创建它!)。因此,当目录丢失时,您可以安全地运行“opcache_reset()”,然后在适当的位置重新创建目录。不会有竞争条件。 (2认同)