Zend OPCache - opcache.enable_cli 1 or 0? 它是什么?它的作用是什么?

37
在文档中,它说“主要用于调试”,这让我想到“除非你有问题需要进行调试,否则不要启用它”,然而大部分关于它的资料都说要启用它,如“opcache.enable_cli 1”,但为什么呢?我找不到任何相关信息,所以如果有人知道,请告诉我,如果文档基本上说要将其保持在0,那么我为什么要启用它呢?

1
虽然被接受的答案 https://dev59.com/z18f5IYBdhLWcg3wFvWn#25047263 对于 PHP 5 是正确的,但是有些回答对于 PHP 7 用户来说也有相关细节,例如 https://dev59.com/z18f5IYBdhLWcg3wFvWn#35880017。 - Mark Fox
3个回答

49

使用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月将此报告为“错误”/“功能请求”,但目前这并不被视为问题。只要小心使用opcache.validate_timestamps=0


如果我们使用 opcache.file_cache_only=0,在一台8GB RAM的服务器上,opcache.memory_consumption 的值应该是多少? - PKHunter
这取决于有多少文件将被缓存/服务器上运行了多少个项目,以及该服务器是否有其他任务要运行PHP-FPM。我建议首先尝试500MB-很难超过那个限制。然后使用像https://github.com/rlerdorf/opcache-status这样的脚本检查您的使用情况,它会给您一个很好的概述,并根据需要调整大小。与其太小不如太大,否则当达到限制时opcache将经常重新启动。 - iquito
2
使用差别非常大,设置CLI之前,我有一个脚本通过IMAP下载电子邮件,它会在100%停留几秒钟,但现在它从未达到30%。 - Brian Leishman
我已经添加了我的错误报告和功能请求的链接。 - iquito
2
@iquito 我发现事情并没有看起来那么可怕。实现原子部署是完全可能的,我在这里写了它(https://www.getpagespeed.com/server-setup/php/zend-opcache#file_cache_cleaning)。基本上,在部署期间,要么使用`mv`或`rm`命令移动或删除基于文件的OPCache目录*本身*,而不是它的内容。这将使其对PHP进程无法使用(因为它不喜欢创建它!)。因此,当目录丢失时,您可以安全地运行`opcache_reset()`,然后在原地重新创建目录。这样就不会有竞争条件了。 - Danila Vershinin
显示剩余4条评论

39

不需要开启它。它主要用于调试 OPcache 本身的问题。

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


但是我也正在使用FastCGI缓存和Nginx。我还是应该关闭它吗? - Jack
@Jack 可以在 cli 中直接执行 opcache 中的代码 - 谷歌 cgi-fcgi - ck_
11
这个答案已经不再适用于现在opcache提供的基于文件的缓存。 - Florian Margaine
3
我刚刚添加了一个答案,提到了PHP7中的新功能,使用新的文件缓存选项时启用 enable_cli 是有意义的。 - iquito
2
@duskwuff:enable_cli=1 对某些库(例如Symfony/Doctrine)有巨大的影响,这些库将缓存存储在php文件中,并在脚本执行期间多次包含这些文件。启用enable_cli=1后,我的CPU使用率降低了20-40%。 - Arnaud Le Blanc
显示剩余3条评论

2
根据PHP文档opcache.enable_cli布尔值为CLI版本的PHP启用opcode缓存。这在测试和调试时非常有用。因此,除非确实需要,否则应禁用它。在命令行中运行一些长期迁移过程时,这可能很有用(个人测试了OPcache v7.0.3 CLI,通过运行一些大规模迁移脚本,并没有看到多少性能提升)。

“测试和调试”部分已从文档中删除。 - Gogowitsch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接