如何使用 PHP OPCache?

Posted

技术标签:

【中文标题】如何使用 PHP OPCache?【英文标题】:How to use PHP OPCache? 【发布时间】:2013-06-17 23:14:38 【问题描述】:

php 5.5 已经发布,它具有一个名为 OPCache 的新代码缓存模块,但似乎没有任何文档。

那么它的文档在哪里以及如何使用 OPcache?

【问题讨论】:

blogs.oracle.com/opal/entry/using_php_5_5_s 文档:php.net/manual/en/book.opcache.php 太糟糕了,文档没有告诉我们如何正确编译 opcache/禁用它,也没有解决 PHP 5.6.24+ 源的 autoconf 问题,以便 PHP 可以编译! :-( @Fred-ii- “有很多设置可能需要调整。了解它的工作原理并在 PHP 5.5 发布过程的稳定阶段识别问题将大有帮助。”... 那篇博文不是很有帮助。它没有解释如何理解它的工作原理或如何最好地调整设置:( 【参考方案1】:

OPcache 取代 APC

因为 OPcache 是为了替代 APC 模块而设计的,所以无法在 PHP 中并行运行它们。这对于缓存 PHP 操作码很好,因为它们都不会影响您编写代码的方式。

但是,这意味着如果您当前正在使用 APC 来存储其他数据(通过 apc_store() 函数),如果您决定使用 OPCache,您将无法做到这一点。

您将需要使用另一个库,例如 APCu 或 Yac,它们都将数据存储在共享的 PHP 内存中,或者切换到使用 memcached 之类的东西,它将数据存储在与 PHP 不同的进程中的内存中。

此外,OPcache 没有与 APC 中的上传进度表等效的功能。相反,您应该使用Session Upload Progress。

OPcache 设置

可以在here 找到 OPcache 的文档,其中列出了所有配置选项here。推荐的设置是:

; Sets how much memory to use
opcache.memory_consumption=128

;Sets how much memory should be used by OPcache for storing internal strings 
;(e.g. classnames and the files they are contained in)
opcache.interned_strings_buffer=8

; The maximum number of files OPcache will cache
opcache.max_accelerated_files=4000

;How often (in seconds) to check file timestamps for changes to the shared
;memory storage allocation.
opcache.revalidate_freq=60

;If enabled, a fast shutdown sequence is used for the accelerated code
;The fast shutdown sequence doesn't free each allocated block, but lets
;the Zend Engine Memory Manager do the work.
opcache.fast_shutdown=1

;Enables the OPcache for the CLI version of PHP.
opcache.enable_cli=1

如果您使用任何使用代码注释的库或代码,您必须启用保存 cmets:

opcache.save_comments=1

如果禁用,所有 PHPDoc cmets 将从代码中删除以减少 优化代码的大小。禁用“文档评论”可能会中断 一些现有的应用程序和框架(例如 Doctrine、ZF2、 PHPUnit)

【讨论】:

这些是生产环境、开发环境还是两者的推荐设置? 也许我对 opcache 到底是什么以及它的用途有误解,但我已经使用下面的 PeeHaa 状态脚本对其进行了配置和测试。一切正常。但我仍然在问 OP 问题。 “如何使用它?”它不是为了缓存视图和东西是吗? @isimmons "OPcache 通过将预编译的脚本字节码存储在共享内存中来提高 PHP 性能,从而消除 PHP 在每个请求上加载和解析脚本的需要。" @marcvangend 好点!我认为缓存只有在生产中才真正有意义,所以这些配置可能是生产设置。 谁能解释为什么推荐的设置性能比默认值差,或者什么时候应该开始生效?【参考方案2】:

安装

OpCache 在 PHP5.5+ 上默认编译。但是默认情况下它是禁用的。为了开始在 PHP5.5+ 中使用 OpCache,您首先必须启用它。为此,您必须执行以下操作。

将以下行添加到您的php.ini

zend_extension=/full/path/to/opcache.so (nix)
zend_extension=C:\path\to\php_opcache.dll (win)

请注意,当路径包含空格时,您应该将其用引号括起来:

zend_extension="C:\Program Files\PHP5.5\ext\php_opcache.dll"

还请注意,您必须使用 <b>zend_</b>extension 指令而不是“普通”extension 指令,因为它会影响实际的 Zend 引擎(即运行 PHP 的东西)。

用法

目前您可以使用四个功能:

opcache_get_configuration():

返回一个数组,其中包含 OpCache 当前使用的配置。这包括所有 ini 设置以及版本信息和列入黑名单的文件。

var_dump(opcache_get_configuration());

opcache_get_status():

这将返回一个数组,其中包含有关缓存当前状态的信息。此信息将包括:缓存的状态(启用、重新启动、已满等)、内存使用情况、命中、未命中和一些更有用的信息。它还将包含缓存的脚本。

var_dump(opcache_get_status());

opcache_reset():

重置整个缓存。这意味着所有可能的缓存脚本将在下次访问时再次解析。

opcache_reset();

opcache_invalidate():

使特定的缓存脚本无效。这意味着脚本将在下次访问时再次解析。

opcache_invalidate('/path/to/script/to/invalidate.php', true);

维护和报告

创建了一些 GUI 来帮助维护 OpCache 并生成有用的报告。这些工具利用了上述功能。

OpCacheGUI

免责声明我是这个项目的作者

特点:

OpCache 状态 OpCache 配置 OpCache 统计数据 OpCache 重置 缓存脚本概述 缓存脚本失效 多语言 移动设备支持 闪亮的图表

截图:

网址:https://github.com/PeeHaa/OpCacheGUI

opcache 状态

特点:

OpCache 状态 OpCache 配置 OpCache 统计数据 缓存脚本概述 单个文件

截图:

网址:https://github.com/rlerdorf/opcache-status

opcache-gui

特点:

OpCache 状态 OpCache 配置 OpCache 统计数据 OpCache 重置 缓存脚本概述 缓存脚本失效 自动刷新

截图:

网址:https://github.com/amnuts/opcache-gui

【讨论】:

有什么关于 PHP-CLI 的吗? CLI 如何使用它?当 FPM 重新启动时,OPCache 会重置 - 它是否也会影响 CLI 的 OPCache? CLI 的 OPCache 是独立的还是与 FPM 共享相同的缓存池?谢谢! 在我最近在 ubuntu 14.04、apache 2.4.7、php 5.5.9 上安装时,我默认启用了 OpCache。 嗨,在你的第三张截图中,cache_full 是假的,我假设它与整页缓存有关,你能告诉我如何打开它吗? (让它成为现实) 我错了,这不是为了缓存整页,但如果缓存使用的内存已满,它会显示为 true。无论如何,谢谢! 请注意,如果您使用的是Xdebug 扩展,则必须在OpCache 扩展之后加载它。【参考方案3】:

我要为我使用 opcache 的东西付出两分钱。

我已经创建了一个包含大量字段、验证方法和枚举的扩展框架,以便能够与我的数据库对话。

没有 opcache

当在没有 opcache 的情况下使用这个脚本并且我在 2.8 秒内将 9000 个请求推送到 apache 服务器时,它会在 70-80 秒内以 90-100% cpu 的速度最大化,直到它赶上所有请求。

Total time taken: 76085 milliseconds(76 seconds)

启用 opcache

启用 opcache 后,它以 25-30% 的 cpu 时间运行大约 25 秒,并且永远不会超过 25% 的 cpu 使用率。

Total time taken: 26490 milliseconds(26 seconds)

我已经创建了一个 opcache 黑名单文件来禁用所有内容的缓存,除了框架是静态的并且不需要更改功能。我只为框架文件明确选择,这样我就可以开发而不用担心重新加载/验证缓存文件。缓存所有内容可以节省一秒钟的请求总数25546 milliseconds

这显着扩展了我每秒可以处理的数据/请求的数量,而服务器甚至不会出汗。

【讨论】:

zend_extension=php_opcache.dll; opcache.memory_consumption=128; opcache.interned_strings_buffer=8; opcache.max_accelerated_files=4000; opcache.revalidate_freq=60; opcache.fast_shutdown=1; opcache.enable_cli=1; opcache.blacklist_filename="C:\xampp\php\cfg\opcache.blacklist; 只需替换 ;在ini文件中输入。但这是我用的。大部分是默认的东西 Opcache 将编译后的 php 文件缓存在内存中。因此,您不再需要通过 php 解析器从磁盘读取和编译和优化文件的开销。 Memcache 可用于在会话之间存储变量。 Sayt 例如,用户有一个更新脚本,该脚本在用户盯着屏幕时请求相同的参数 10 秒。您可以使用内存缓存编译一次查询,然后继续从内存中请求编译后的查询,而不是重新生成它。 它没有。 opcache.revalidate_freq=60; 确定文件在内存中的存活时间(以秒为单位)。时间到了,它会重新编译文件。 实际上,opcache.revalidate_freq 控制检查脚本更改的频率(基于其时间戳是否更改)。因此,如果脚本的时间戳与上次编译时相同,则不会重新编译。所有这一切都假设您没有更改默认启用的opcache.validate_timestamps 设置。【参考方案4】:

我在设置moodle时遇到了这个问题。 我在 php.ini 文件中添加了以下几行。

zend_extension=C:\xampp\php\ext\php_opcache.dll

[opcache]
opcache.enable = 1
opcache.memory_consumption = 128
opcache.max_accelerated_files = 4000
opcache.revalidate_freq = 60

; Required for Moodle
opcache.use_cwd = 1
opcache.validate_timestamps = 1
opcache.save_comments = 1
opcache.enable_file_override = 0

; If something does not work in Moodle
;opcache.revalidate_path = 1 ; May fix problems with include paths
;opcache.mmap_base = 0x20000000 ; (Windows only) fix OPcache crashes with event id 487

; Experimental for Moodle 2.6 and later
;opcache.fast_shutdown = 1
;opcache.enable_cli = 1 ; Speeds up CLI cron
;opcache.load_comments = 0 ; May lower memory use, might not be compatible with add-ons and other apps

extension=C:\xampp\php\ext\php_intl.dll

[intl]
intl.default_locale = en_utf8
intl.error_level = E_WARNING

国际 -> http://php.net/manual/en/book.intl.php

【讨论】:

可能值得注意的是,这里记录了此设置:docs.moodle.org/30/en/OPcache opcache.fast_shutdown = 0 github.com/zendtech/ZendOptimizerPlus/issues/146【参考方案5】:

在 Amazon Linux 上使用 PHP 5.6(在 RedHat 或 CentOS 上应该相同):

yum install php56-opcache

然后重启apache。

【讨论】:

以上是关于如何使用 PHP OPCache?的主要内容,如果未能解决你的问题,请参考以下文章

如何确定是不是启用了 PHP OPcache?

如何在 MAC Sierra (MAMP) 上为 PHP7.1 启用 OPCache

如何检测是不是启用了 PHP JIT

启用 PHP 5.5 OPCache

PHP Opcache工作原理

php之Opcache深入理解