如何使用PHP OPCache?


249

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

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




太糟糕了,文档没有告诉我们如何正确编译opcache /禁用它,也无法解决PHP 5.6.24+源代码的autoconf问题,以便PHP可以编译!:-(
Filip Overtone歌手Rydlo

@ Fred-ii- “可能需要调整许多设置。了解它的工作原理并在PHP 5.5发布过程的稳定阶段发现问题将大有帮助。” ...该博客文章不是很有帮助。它没有说明如何理解其工作原理或如何最好地调整设置:(
icc97

Answers:


371

安装

默认情况下,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"

另请注意,您将必须使用zend_extension指令而不是“ normal” 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重置
  • 缓存脚本概述
  • 缓存脚本无效
  • 自动刷新

屏幕截图:

opcache-gui-overview

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


6
有什么关于PHP-CLI的内容吗?CLI如何利用它?重新启动FPM时,OPCache会重置-是否还会影响CLI的OPCache?CLI的OPCache是​​单独的还是与FPM共享相同的缓存池?谢谢!
Shahriyar Imanov 2014年

3
默认情况下,我在ubuntu 14.04,apache 2.4.7,php 5.5.9上的最新安装中默认启用了OpCache。
jstats 2014年

嗨,在您的第三个屏幕快照中,cache_full为false,我假设它与全页缓存有关,您能告诉我如何打开它吗?(实现)
brucekaushik

我错了,不是要缓存整个页面,但是如果缓存使用的内存已满,它将显示为true。不管怎么说,多谢拉!
brucekaushik 2014年

zend_extension = C:\ path \ to \ php_opcache.dll(win)-在php.ini中添加此行可以正常工作。
Kalidasan

152

OPcache取代APC

因为OPcache旨在替代APC模块,所以不可能在PHP中并行运行它们。这适合缓存PHP操作码,因为它们都不影响编写代码的方式。

但是,这意味着,如果您当前正在使用APC(通过apc_store()函数)存储其他数据,则在决定使用OPCache时将无法执行此操作。

您将需要使用诸如APCuYac之类的另一个库,它们都将数据存储在共享的PHP内存中,或者切换到使用诸如memcached之类的库,后者将数据存储在与PHP分开的进程中。

此外,OPcache不具有与APC中存在的上载进度表等效的功能。相反,您应该使用“ 会话上传进度”

OPcache的设置

对于OPcache的文档,可以发现这里所有列出的配置选项在这里。推荐的设置是:

; 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

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

opcache.save_comments=1

如果禁用,则会从代码中删除所有PHPDoc注释,以减小优化代码的大小。禁用“文档注释”可能会破坏某些现有的应用程序和框架(例如,Doctrine,ZF2,PHPUnit)


4
是针对生产环境,开发或两者的建议设置?
marcvangend

1
可能我对opcache的确切含义和用途有误解,但是我使用下面的PeeHaa状态脚本对其进行了配置和测试。一切正常。但是我仍然在问OP问题。“如何使用它?” 它不是用于缓存视图吗?
isimmons 2013年

3
@isimmons“ OPcache通过将预编译的脚本字节码存储在共享内存中来提高PHP性能,从而消除了PHP在每个请求上加载和解析脚本的需要。”
Danack

1
@marcvangend好点!我认为缓存在生产中只有真正的意义,因此这些配置可能是生产设置。
Sliq

3
谁能解释为什么建议的设置性能比默认设置差,或者何时应该开始生效?
RP 2014年

19

我将花两分钱购买opcache。

我已经建立了一个包含许多字段和验证方法以及枚举的广泛框架,可以与我的数据库进行对话。

没有opcache

当使用不带opcache的此脚本时,我在2.8秒内将9000个请求推送到apache服务器,它以90-100%cpu的速度最大化70-80秒,直到它赶上了所有请求。

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

这极大地扩展了我每秒可以处理的数据/请求数量,而服务器却不费吹灰之力。


3
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文件中输入enter。但这就是我用的。大部分为默认内容
Tschallacka 2015年

1
顺便说一句,我用memcache运行2100个数据库来运行它,要求每秒运行我在150微秒(约1毫秒的
1/6

1
Opcache将php文件以编译形式缓存在内存中。因此,您不再需要通过PHP解析器读取磁盘以及编译和优化文件的开销。您可以使用Memcache在会话之间存储变量。例如,说一个用户有一个更新脚本,该脚本在用户盯着屏幕的同时请求10秒钟的相同参数。您可以使用mem缓存一次编译查询,然后继续从重新生成它的内存请求存储已编译查询。
Tschallacka 2015年

2
没有。opcache.revalidate_freq=60;确定文件在内存中的生存时间(以秒为单位)。时间到了,它将重新编译文件。
Tschallacka 2015年

3
实际上,opcache.revalidate_freq控制检查脚本更改的频率(基于其时间戳是否更改)。因此,如果脚本的时间戳记与上次编译的时间戳记相同,则不会重新编译。所有这些都是假设您尚未更改opcache.validate_timestamps设置(默认情况下已启用)。
jjlin

4

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

yum install php56-opcache

然后重新启动apache。


2

我在设置心情时遇到了这个问题。我在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/zh/book.intl.php


1
可能是值得注意的是,这个设置是记录在这里:docs.moodle.org/30/en/OPcache
sierrasdetandil

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.