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

Posted

技术标签:

【中文标题】Zend OPCache - opcache.enable_cli 1 还是 0?它有啥作用?【英文标题】:Zend OPCache - opcache.enable_cli 1 or 0? What does it do?Zend OPCache - opcache.enable_cli 1 还是 0?它有什么作用? 【发布时间】:2014-09-22 13:36:15 【问题描述】:

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

【问题讨论】:

虽然接受的答案 ***.com/a/25047263/934195 对于 php 5 是正确的,但有些答案具有 PHP 7 用户的相关详细信息,例如 ***.com/a/35880017/934195 【参考方案1】:

别说了。它主要用于调试 OPcache 本身的问题。

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

【讨论】:

但我也在使用 FastCGI 缓存和 nginx。我还应该把它关掉吗? 别说了。它对 FastCGI 完全没有任何影响。 对于 opcache 现在提供的基于文件的缓存,此答案不再是最新的。 @duskwuff:我刚刚添加了一个关于 PHP7 中这个新功能的答案,在这里启用 enable_cli 和新的文件缓存选项是有意义的。 @duskwuff: enable_cli=1 对一些将缓存存储在 php 文件中的库(例如 Symfony/Doctrine)产生巨大影响,并在脚本执行期间多次包含这些文件。通过 enable_cli=1,我的 CPU 使用率降低了 20-40%。【参考方案2】:

根据PHP docs:

opcache.enable_cli boolean 为 PHP 的 CLI 版本启用操作码缓存。这对于测试和调试非常有用。

因此除非你真的需要它,否则它应该被禁用。

当您从命令行运行一些长期迁移过程时,这可能很有用(我个人已经通过运行一些扩展的迁移脚本为 CLI 测试了 OPcache v7.0.3,但我没有看到太多的性能改进)。

【讨论】:

“测试和调试”部分已从文档中删除。【参考方案3】:

使用 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

opcache.file_cache_only=1 确保禁用内存中的 opcache 并且只使用文件,这正是 CLI 所需的。这应该会大大增加执行时间。

在 FPM 的 php.ini 中,您将希望具有相同的设置但使用 opcache.file_cache_only=0,因此使用内存中的 opcache 并且文件缓存用作备用(这也使 FPM 更快,因为当 FPM 重新启动或 opcache 重置时,文件缓存减少了预热时间,因为缓存的文件仍然存在)。

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

2017 年更新

我不建议再将文件缓存与 FPM 一起使用(仅用于 CLI),因为在设置 opcache.validate_timestamps=0 时无法重置缓存 - 文件缓存会阻止 PHP-FPM 识别任何更改,因为opcache_reset() 甚至完全重启 PHP-FPM 都不会影响文件缓存并且文件缓存没有等效项,因此永远不会注意到更改的脚本。我在 2016 年 3 月将此报告为“bug”/“feature request”,但目前这不被视为问题。请注意,如果您使用opcache.validate_timestamps=0

【讨论】:

如果我们使用opcache.file_cache_only=0,那么opcache.memory_consumption在8GB RAM服务器上的值应该是多少? 这取决于将缓存多少文件/服务器上正在运行多少项目,以及该服务器是否有其他职责而不是运行 PHP-FPM。我建议先用 500MB 试试——很难超过这个值。然后使用 github.com/rlerdorf/opcache-status 之类的脚本检查您的使用情况,它可以为您提供一个很好的概览,并在必要时调整大小。宁可过大也不要过小,否则 opcache 在达到限制时会频繁重启。 使用差异令人难以置信,在设置 CLI 以使用它之前,我有一个通过 IMAP 下载电子邮件的脚本,它会以 100% 的速度一次在那里停留几秒钟,但现在它从未达到 30% @iquito 不只是使用rm 删除实际的缓存文件吗? @iquito 我发现事情并没有看起来那么可怕。原子部署是很有可能的,我已经写了here。本质上是mvrm 基于文件的OPCache 目录本身,而不是部署期间的内容。这将使 PHP 进程无法使用它(因为它不喜欢创建它!)。因此,当目录丢失时,您可以安全地运行opcache_reset(),然后在适当位置重新创建目录。不会有竞争条件。

以上是关于Zend OPCache - opcache.enable_cli 1 还是 0?它有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章

modern php enable zend opcache

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

PHP 缓存插件之 Zend Opcache ( 取代 APC )

PHP安装使用Zend Opcache扩展

PHP安装使用Zend Opcache扩展

用Zend OPCache提高PHP的性能