在文档中它说"主要用于调试"除非你遇到问题并且需要做一些调试,否则会让我思考并且永远不会启用它。"然而阅读大部分我能找到的关于它的内容都说要启用它" opcache.enable_cli 1"但为什么?我找不到任何有关此事的信息,所以如果有人知道的话,如果文档基本上说它保持在0,我为什么要启用它呢?
答案 0 :(得分:30)
不要这样做。它主要用于调试OPcache本身的问题。
opcache.enable_cli
选项在从命令行运行PHP脚本时启用PHP OPcache(使用php
命令)。但是,请记住,对于PHP 5.x,OPcache扩展通过将缓存的操作码存储在当前进程的内存中来工作。这仅在运行PHP的进程将处理可以重用这些操作码的多个请求时有用,例如在Web服务器或FastCGI中。对于像PHP CLI这样运行一个“请求”并退出的进程,它只会浪费内存和时间。
答案 1 :(得分:25)
使用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将内存缓存作为第二个primpary缓存以获得最大速度。 PHP7的一大改进!只需确保选择CLI和FPM可以写入的opcache.file_cache
目录,并且同一个用户进行写入/读取。
2017年更新
我不建议再将文件缓存用于FPM(仅用于CLI),因为在设置opcache.validate_timestamps=0
时无法重置缓存 - 文件缓存阻止PHP-FPM识别任何更改,因为opcache_reset()
甚至完整的PHP-FPM重新启动不会影响文件缓存,并且没有文件缓存的等效项,因此永远不会注意到更改的脚本。我在2016年3月将此报告为“bug”/“feature request”,但目前这不是一个问题。请注意,如果您使用opcache.validate_timestamps=0
!
答案 2 :(得分:2)
根据PHP docs:
$data = $pdo->query('SELECT * FROM users')->fetchAll(PDO::FETCH_ASSOC); array_unshift($data, array_keys($data));
为CLI版本的PHP启用操作码缓存。这对测试和调试非常有用。
因此,除非您真的需要,否则应该禁用它。
当您从命令行运行一些长期迁移过程时,这非常有用(我个人通过运行一些广泛的迁移脚本测试了用于CLI的OPcache v7.0.3,但我没有看到太多的性能改进)。