如何正确使用OPcache优化系统性能_7small7的博客-CSDN博客_opcache


本站和网页 https://blog.csdn.net/qq_27681741/article/details/120479350 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

如何正确使用OPcache优化系统性能_7small7的博客-CSDN博客_opcache
如何正确使用OPcache优化系统性能
7small7
已于 2022-04-30 04:17:01 修改
1370
收藏
分类专栏:
后端开发-PHP
文章标签:
php
面试
性能优化
于 2021-09-25 22:57:49 首次发布
本文为博主7small7原创文章,未经博主允许不得转载。
本文链接:https://blog.csdn.net/qq_27681741/article/details/120479350
版权
后端开发-PHP
专栏收录该内容
2 篇文章
0 订阅
订阅专栏
专注于PHP、MySQL、Linux和前端开发,感兴趣的感谢点个关注哟!!!文章整理在GitHub,主要包含的技术有PHP、Redis、MySQL、JavaScript、HTML&CSS、Linux、Java、Golang、Linux和工具资源等相关理论知识、面试题和实战内容。
文章说明
一直知道opcache可以提高PHP性能,但没有具体的关注,更多的利用其他的组件来提升系统的性能。一次无意开启了opcache之后,并随意设置了一些配置。结果导致后面在使用一个项目时,发现项目总是不会读取到最新的代码,而是隔一段时间才会执行到最新代码。排查了很久才想起来开启了opcache,于是对opcache做了一个简单的学习与总结。
发现这个优化小技巧之后,后面也会对稍微底层进行探索学习,欢迎大家持续关注该文。
什么是opcache
OPcache 通过将 PHP 脚本预编译的字节码存储到共享内存中来提升 PHP 的性能, 存储预编译字节码的好处就是 省去了每次加载和解析 PHP 脚本的开销。
opcache运行原理
不使用opcache
在使用opcache之前,我们事先看一个request,PHP的一个大致处理流程是如何的。大致的示意图如下:
首先会去模块初始化一次,也就是加载我们php.ini当中的一些配置信息,这里需要根据配置信息初始化一次。 初始化完php.ini的配置信息之后,第二步就是针对当前请求的信息做一次初始化。例如我的一些get、post以及$_SEVER等相关的信息。 得到上面1和2中的信息之后,则时候就会去真正执行我们的php脚本文件内容了,也就是我们写的代码。是怎么去实现的呢?如下图: Zend引擎读取.php文件–>扫描其词典和表达式 -->解析文件–>创建要执行的计算机代码(称为Opcode)–>最后执行Opcode–> response 返回。 执行完php脚本文件内容之后,这时候会针对1和2中的一些初始化信息,进行销毁。
使用opcache
当使用opcache之后,当一个请求来了之后,依然的会去执行上面提到的1和2,进行模块和请求的初始化。接着就会去编译php脚本文件内容,opcache也是在这一个阶段才会产生作用。
通过上面的第3步,我们可以看到每一次请求都会去解析php文件内容,不管是php文件的内容是否发生变化,都会执行这样的一个重复流程来生成opcode。
opcache的作用就是减少每次请求都会去编译php脚本文件,第一次将编译好的脚本文件内容缓存起来,下一次请求就不需要去重复编译了,而是直接冲内存中取就行了。减少了CPU和内存的消耗。
首先会去模块初始化一次,也就是加载我们php.ini当中的一些配置信息,这里需要根据配置信息初始化一次。 初始化完php.ini的配置信息之后,第二步就是针对当前请求的信息做一次初始化。例如我的一些get、post以及$_SEVER等相关的信息。 此时去解析php脚本文件,首先会去判断opcode是否存在,如果不存在就执行一个编译流程并缓存到共享内存中。当存在opcode时,则直接使用共享内存中的opcode,不会再进行一次编译的过程。 执行完php脚本文件内容之后,这时候会针对1和2中的一些初始化信息,进行销毁。
使用总结
通过上面的对比,很容易看得出来opcache执行的时段在于编译php脚本文件,减少了编译的过程。 对于模块初始化、请求初始化等这样的一个重复流程,该如何优化。这里可以去了解一下swoole。 可能会存在这样一个疑问,opcode给缓存起来了,如果我们更新了代码,这时候还是会加载旧的opcode还是重新编译一次opcode并缓存起来呢?后面我们会单独总结。
opcache配置说明
[opcache]
; 是否快开启opcache缓存。
;opcache.enable=1
; 是否在cli模式下开启opcache。
;opcache.enable_cli=1
; opcache共享内存的大小(单位是M)。
;opcache.memory_consumption=128
; 预留字符串的的内存大小(单位是M)。
;opcache.interned_strings_buffer=8
; 在hash表中存储的最大脚本文件数量,范围是200到1000000之间。实际的情况是在{ 223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987 }中找到第一个大于等于设置值的质数。最小范围是200。
;opcache.max_accelerated_files=10000
; 浪费内存的上线,如果超过这个上线,opcache将重新启动。
;opcache.max_wasted_percentage=5
; 如果启用,opcache将会在hash表的脚本键后面增加一个文件目录,避免吃同名的脚本产生冲突。禁用的话可以提高性能,但是也容易导致应用不可用。
;opcache.use_cwd=1
; 如果启用(1),opcache会每隔设置的值时间来判断脚本是否更新。如果禁用(0),则不会自动检测脚本更新,必须通过重启PHP服务,或者使用opcache_reset()、opcache_invalidate()函数来刷新缓存。
;opcache.validate_timestamps=1
; opcache检查脚本是否更新的时间周期(单位是秒),如果设置为0则会针对每一个请求进行检查更新,如果validate_timestamps=0,该值不会生效。
;opcache.revalidate_freq=60
; 如果禁用,在统一include_path下面已经缓存的文件将被重用,因此无法找到该路径下的同名文件。
;opcache.revalidate_path=0
; 是否保存PHP脚本中的注释内容。禁用,则不会缓存PHP代码中的注释,可以减少文件中的体积,但是一些依赖注释或者注解将无法使用。
;opcache.save_comments=1
; 如果启用,则会使用快速停止续发事件。 所谓快速停止续发事件是指依赖 Zend 引擎的内存管理模块 一次释放全部请求变量的内存,而不是依次释放每一个已分配的内存块。
; 在php7.2.0开始,被移除,这类说的事件将会在PHP中自动处理。
;opcache.fast_shutdown=1
; 如果启用,在调用file_exists()、is_file()和is_readable()函数时,不管文件是否被缓存,都会检测操作码。如果禁用,可能读取的内容是一些旧数据。
;opcache.enable_file_override=0
; 控制优化级别,是一个二进制的位的掩码。
;opcache.optimization_level=0xffffffff
; 不进行编译优化的配置文件路径。该文件中配置具体哪些不被编译的文件。如果文中每行的开头是";"开头,则会被视为注释。黑名单中的文件名,可以是通配符,也可以使用前缀。
; 例如配置文件的路径是"/home/blacklist.txt",则该配置的值就是该路径。
; 配置的内容可以是如下格式
; 这是一段注释,在解析的时候因为开头是;,则会被视为注释
;/var/www/a.php
;/var/www/a/b.php
;opcache.blacklist_filename=
; 以字节为单位的缓存的文件大小上限。设置为 0 表示缓存全部文件。
;opcache.max_file_size=0
; 每个N次请求会检查缓存校验和,0是不检查。该项对性能有较大影响,尽量在调试环境中使用。
;opcache.consistency_checks=0
; 如果缓存处于非激活状态,等待多少秒之后计划重启。 如果超出了设定时间,则 OPcache 模块将杀除持有缓存锁的进程, 并进行重启。
;opcache.force_restart_timeout=180
; 错误日志文件位置,不填写将默认输出到服务器的错误日志文件中。
;opcache.error_log=
; 错误日志文件等级。
; 默认情况下,仅有致命级别(0)及错误级别(1)的日志会被记录。 其他可用的级别有:警告(2),信息(3)和调试(4)。
; 如何设置的是1以上,在进行force_restart_timeout选项时,会将错误日志中插入一条警告信息。
;opcache.log_verbosity_level=1
; opcache首选的内存模块,不配置则自动选择。可以选择的值有mmap,shm, posix 以及 win32。
;opcache.preferred_memory_model=
; 保护共享内存,以避免执行脚本时发生非预期的写入。 仅用于内部调试。
;opcache.protect_memory=0
; 只允许指定字符串开头的PHP脚本调用opcache api函数,默认不做限制。
;opcache.restrict_api=
; 在 Windows 平台上共享内存段的基地址。 所有的 PHP 进程都将共享内存映射到同样的地址空间。 使用此配置指令避免“无法重新附加到基地址”的错误。
;opcache.mmap_base=
; 配置二级缓存目录并启用二级缓存。 启用二级缓存可以在 SHM 内存满了、服务器重启或者重置 SHM 的时候提高性能。 默认值为空字符串 "",表示禁用基于文件的缓存。
;opcache.file_cache=
; 启用或禁用在共享内存中的 opcode 缓存。
;opcache.file_cache_only=0
; 当从文件缓存中加载脚本的时候,是否对文件的校验和进行验证。
;opcache.file_cache_consistency_checks=1
; 在 Windows 平台上,当一个进程无法附加到共享内存的时候, 使用基于文件的缓存。需要开启opcache.file_cache_only选项。建议开启此选项,否则可能导致进程无法启动。
;opcache.file_cache_fallback=1
; 启用或者禁用将 PHP 代码(文本段)拷贝到 HUGE PAGES 中。 此项配置指令可以提高性能,但是需要在 OS 层面进行对应的配置。
;opcache.huge_code_pages=1
; 针对当前用户,验证缓存文件的访问权限。
;opcache.validate_permission=0
; 在 chroot 的环境中避免命名冲突。 为了防止进程访问到 chroot 环境之外的文件,应该在 chroot 的情况下启用这个选项。
;opcache.validate_root=0
配置示例
下面这一段代码是PHP官方给的一个示例配置,推荐使用该配置项进行配置,也可以根据自己实际的情况进行单独配置。
;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
问题总结
如何更新opcode?
编译好的opcode会添加到共享内存中,如果我们更新了代码就需要去更新opcode,否则得到的代码还是旧的opcode。就会发生文章开头说到的情况。要解决这个问题,我们有几种方式。
; 方法一
直接重启我们的php进程,但这样会导致服务中断,是一种不推荐的方式。
; 方法二
根据官方给出的函数,进行设置。在代码中使用opcache_reset()或者使用opcache_invalidate()函数进行充值opcode。直接通过一个特殊的链接去执行这个函数即可。
; 方法三
使用php.ini中的配置项实现自动充值opcode。
opcache.validate_timestamps = 1
opcache.revalidate_freq = 60
效果演示
上面的两张图,第一张是未开启opcache的一个压测,第二个是开启opcache的一个压测。 从截图上来看,开启opcache开启之后,有一些小幅度的提升。也并没有网上说的翻倍的提升。 这里的提升不能说opcache的提升效果不明显,这需要根据综合因素决定,这里的演示使用Mac操作本身就会降低很多。
7small7
关注
关注
点赞
收藏
打赏
评论
如何正确使用OPcache优化系统性能
专注于PHP、MySQL、Linux和前端开发,感兴趣的感谢点个关注哟!!!文章整理在GitHub,主要包含的技术有PHP、Redis、MySQL、JavaScript、HTML&CSS、Linux、Java、Golang、Linux和工具资源等相关理论知识、面试题和实战内容。文章说明一直知道opcache可以提高PHP性能,但没有具体的关注,更多的利用其他的组件来提升系统的性能。一次无意开启了opcache之后,并随意设置了一些配置。结果导致后面在使用一个项目时,发现项目总是不会读取到最新.
复制链接
扫一扫
专栏目录
PHP Opcache 配置优化实战
l2x1314258的博客
04-02
364
前言
起源:在很长的一段时间里,我们的web服务器在遇到大规模流量访问的时候,很容易就把 CPU 负载飙到了 100%,导致响应速度过慢,用户体验卡顿,直到最近开启了Opcahe后,我们的QPS从200-300+,提升了1000+,响应速度也提高了很多,经过几天的摸爬滚打,终于有了一些些小小的经验,终于可以分享一下了。
在网上很多搜索Opcache配置优化的一些博客,很快就能获得一堆配置,但是是否真的适用于现在的项目规模和资源模式呢?对此下面将说明一些如何根据项目实际情况去优化opcache配置。
这是一段
参与评论
您还未登录,请先
登录
后发表或查看评论
安装opcache和apcu——k8s从入门到高并发系列教程(十二)
最新发布
fanghailiang2016的博客
09-16
140
安装opcache和apcu。opcache可以避免每次请求都要读取php脚本文件生成opcode的过程。而apcu可以在多次不同的请求之间共享一些信息,避免每次请求查询这些公共信息造成额外的网络请求和数据库查询
php opcache缺点,PHP Opcache 注意事项以及调优
weixin_35797963的博客
03-26
854
从 PHP5.5 开始,Opcache 扩展是核心的一部分,增加了对 PHP 脚本的字节码缓存的支持。对于动态语言(例如 PHP ),字节码缓存可以显著的提高性能,因为它可以确保脚本仅被编译一次。Opcache 扩展的默认设置已经在很大程度上提高了 PHP 的性能,但是您可以通过修改默认配置以获取更佳的性能。警告:这篇文章反复提到的监视统计信息opcache_get_status(false)...
关于opcache中opcache.revalidate_freq参数设置测试报告
mweibiao的博客
08-08
5967
1.测试目的:
测试出opcache中,opcache.revalidate_freq这个参数最适合的大小
说明:如果opcache.revalidate_freq参数越大,服务器单位时间能接收的请求越多,但是加载代码的频率越低,会造成代码加载不及时的问题,本次测试要找出相对最适合值
2.测试方法
(1)加载文件
<?php
for($i=0;$i<1000;$i++...
聊聊 PHP 的 OPcache
写代码的大胖
09-26
182
前两天被问到了问题,关于 OPcache 我配置过有多少?当时简单的想了一下,貌似这个东西我没配置过几个,就说了调整了五六个选项。然后又大概说了一下这五六个都调整了什么,我就说了一下缓存时长,跳过文件,内存大小,文件数量什么的。因为自己印象里面貌似能记住的就这几个了,然后对方告诉我 OPcache 有 30 多个可调整选项。说实话,我当时都惊了,这么多!!! 事后回家翻了一下我自己的配置部分,发现我配置的也有十几个了,但是分类呢,也就是我上面说的那几个。所以呢,今天就重新翻了一波文档,并且结合自己的理解,说
PHP性能加速-opcache
guok的博客
12-25
235
一.opcache介绍
OPcache 是一个通过将 PHP 脚本预编译的字节码存储到共享内存中来提升 PHP 性能的PHP扩展。 存储预编译字节码的好处就是 省去了每次加载和解析 PHP 脚本的开销。PHP 5.5.0 及后续版本中已经绑定了 OPcache 扩展。
二.php处理流程
http request ---> nginx(代理)----> php-fpm(master 进程,分配)----> php-fpm(worker处理 ) ---->php-cgi(1.启动
【五分钟读懂】PHP中的opcache是什么,opcache是用来干嘛的?
TCMvines的博客
04-21
2588
前言
opcache从字面意思,肯定是缓存这一块的。但是你是否知道它的工作原理是怎样的呢?
这里一点一点让你了解!PHP项目中,尤其是在高并发大流量的场景中,如何提升PHP的响应时间,是一项十分重要的工作。而Opcache又是优化PHP性能不可缺失的组件,尤其是应用了PHP框架的项目中,作用更是明显。
一、概述
在理解 OPCache 功能之前,我们有必要先理解PHP-FPM + Nginx 的工作机制,以及PHP脚本解释执行的机制。
1、PHP-FPM + Nginx 的工作机制
php系列框架的加速器Opcache
weixin_33895475的博客
11-23
1587
一、个人实践发现opcache
最近为了应对双十一期间高流量的冲击,小编通过压力测试去查找服务器性能瓶颈,发现100并发时,QPS并不是很高,但CPU和内存消耗特别高,尤其是CPU消耗都100%了,而我们的容器和服务器配置都差不多升级到顶级了,这不是如此好的服务器该发挥的效果,于是小编进行了一次全面排查:
查看接口中数据库查询部分,该部...
php优化 之opcache开启和关闭
geshui91的博客
08-14
607
opcache.interned_strings_buffer=16 //interned string的内存大小, 也可调。opcache.memory_consumption=256 //共享内存大小, 这个根据你们的需求可调。opcache.save_comments=0 //不保存文件/函数的注释。opcache.max_accelerated_files=40000 //最大缓存的文件数目。查看opcache状态。...
了解OpCache
culi3118的博客
08-16
188
PHP in version 5.5 comes with a caching engine built-in – OpCache – which stores precompiled script bytecode in the memory. If you’re familiar with APC or Xcache, you will already know how such engine...
opcache(宝塔linux)
ibattle1的博客
05-11
1602
常用配置
#开关打开
opcache.enable=1
#开启CLI
opcache.enable_cli=1
#可用内存, 酌情而定, 单位为:Mb
opcache.memory_consumption=128
#Zend Optimizer + 暂存池中字符串的占内存总量.(单位:MB)
opcache.interned_strings_buffer=8
#对多缓存文件限制, 命...
PHP7开启opcache打造强悍性能
weixin_33920401的博客
05-04
265
鸟哥在博客中说,提高PHP 7性能的几个tips,第一条就是开启opcache:
记得启用Zend Opcache, 因为PHP7即使不启用Opcache速度也比PHP-5.6启用了Opcache快,所以之前测试时期就发生了有人一直没有启用Opcache的事情
那么什么是Opcache呢?
Opcache 的前生是...
opcache php fpm 502,谈谈opcache的一些琐碎事(一不小心服务器内存就爆了)
weixin_29304985的博客
03-17
265
谈谈opcache的一些碎琐事(一不小心服务器内存就撑爆了)在生效中,有两个主要配置1.当validate_timestamps设置0时,opcache.revalidate_freq的值将失效,validate_timestamps作用主要验证是否要重新生成缓存脚本,PHP将不会检测代码是否改变,这样会导致部署更新的代码后,不会自动生成新的缓存,就导致还是显示原来的旧代码; 当然,(这样性能最佳...
PHP 开启 Opcache 后的一些坑
m1ssyAn的博客
01-08
794
众所周知,PHP5.5 以后官方自带了一个组件叫Zend Opcache,具体可以参看官方文档。开启此扩展后可以提高 PHP 的执行效率,具体提升多大我会在最后给一个简简单单的测试,提供给大家参考。
Opcache 的执行流程大致如下,
Opcache 的目地是避免重复编译,减少 CPU 和内存开销。
由于这篇文章的本意是想记录以及备注一下开启 opcache 后出现的一些问题,所以这篇文章不会记录如何安装 opcache 以及如何配置,推荐这篇文章大家参考一下就可以了,配置说的都很明确了。
Opcache
Thelian的博客
10-28
517
Opcache参考文档:https://www.douban.com/group/topic/58368149
http://blog.csdn.net/why_2012_gogo/article/details/51134674php5.5的版本,系统自带opcache的,不需要重新安装。Opcache是一种通过将解析的PHP脚本预编译的字节码存放在共享内存中来避免每次加载和解析PHP脚本的开销
php 清除缓存流,php怎么清除opcache缓存
weixin_32522079的博客
03-22
148
php清除opcache缓存的方法:1、开发环境中修改php.ini文件,将“opcache.revalidate_freq”的值改为1;2、在线上环境中,可以在PHP文件中执行“opcache_reset();”代码,重启web服务器。本教程操作环境:windows7系统、PHP7.1版,DELL G3电脑1、php.ini默认配置opcache.validate_timestamps=1opc...
Opcache介绍使用
nn小木屋
11-17
243
推荐的 php.ini 中 Opcache的配置
以下是官网推荐的php.ini中的配置。可以在生产环境获得更高的性能:
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_fre...
opcache缓存设置
morishima的博客
03-05
608
前言
在 php7.4 版本中有缓存设置,在项目开发的过程中会影响代码调试。
opcache.enable 启用操作码缓存,默认为“1”
如果禁用此选项,则不会优化和缓存代码。 在运行期使用 ini_set() 函数只能禁用 opcache.enable 设置,不可以启用此设置。 如果在脚本中尝试启用此设置项会产生警告。
opcache.enable_cli 仅针对 CLI 版本的 PHP 启用操作码缓存。
通常被用来测试和调试。
opcache.revalidate_freq=0 检查脚本时
Zend Opcache 的最佳设置
weixin_33739523的博客
07-01
161
在网上无意中看到的一篇文章,这哥们非常简洁地谈论了zend opcache的最佳设置,他说他为此花了大量的时间探索zend opcache的每个设置选项的细节,甚至是阅读它的源代码,并且在自己的项目中实践(一个每天有117 million的HTTP请求的应用)。
Opcache优化在著名的《modern php》 中也有重要篇幅。在PHP...
php opcache文件还原,PHP开启Opcache后的一些坑
weixin_36255517的博客
03-12
390
众所周知,PHP5.5以后官方自带了一个组件叫Zend Opcache,具体可以参看官方文档。开启此扩展后可以提高PHP的执行效率,具体提升多大我会在最后给一个简简单单的测试,提供给大家参考。Opcache的执行流程大致如下,Opcache 的目地是避免重复编译,减少 CPU 和内存开销。由于这篇文章的本意是想记录以及备注一下开启opcache后出现的一些问题,所以这篇文章不会记录如何安装opca...
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
©️2022 CSDN
皮肤主题:大白
设计师:CSDN官方博客
返回首页
7small7
CSDN认证博客专家
CSDN认证企业博客
码龄8年
暂无认证
21
原创
5万+
周排名
4万+
总排名
17万+
访问
等级
303
积分
39
粉丝
45
获赞
评论
213
收藏
私信
关注
热门文章
熬夜整理的一份elasticsearch中文文档手册
4047
vscode最适合编程的 6 种字体
3745
如何正确使用OPcache优化系统性能
1370
Redis客户端管理神器RedisInsight 推荐
1332
最全总结Redis数据类型使用场景
1119
分类专栏
后端开发-Golang
11篇
数据库-MySQL
1篇
数据库-Redis
2篇
开发工具
3篇
后端开发-PHP
2篇
elasticsearch
1篇
面试题
1篇
软件设计
2篇
产品介绍
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
Go最全学习资料汇总
你应该知道的17个Golang包
面试大厂 看这篇MySQL面试题就够了
2022年21篇
2021年2篇
目录
目录
分类专栏
后端开发-Golang
11篇
数据库-MySQL
1篇
数据库-Redis
2篇
开发工具
3篇
后端开发-PHP
2篇
elasticsearch
1篇
面试题
1篇
软件设计
2篇
产品介绍
目录
评论
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
打赏作者
7small7
你的鼓励将是我创作的最大动力
¥2
¥4
¥6
¥10
¥20
输入1-500的整数
余额支付
(余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付
您的余额不足,请更换扫码支付或充值
打赏作者
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。
余额充值