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

时间:2014-07-30 18:59:42

标签: php zend-cache opcache php-5.5

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

3 个答案:

答案 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,但我没有看到太多的性能改进)。