opcache的原理

1、Opcache是什么?

Opcache是一种通过将解析的PHP脚本预编译的字节码(Operate Code)存放在共享内存中来避免每次加载和解析PHP脚本的开销,解析器可以直接从共享内存读取已经缓存的字节码(Operate Code),从而大大提高PHP的执行效率。

2、什么是Operate Code?

当解释器完成对脚本代码的分析后,便将它们生成可以直接运行的中间代码,也称为操作码(Operate Code,opcode)。Opcode cache的目地是避免重复编译,减少CPU和内存开销。如果动态内容的性能瓶颈不在于CPU和内存,而在于I/O操作,比如数据库查询带来的磁盘I/O开销,那么opcode cache的性能提升是非常有限的。但是既然opcode cache能带来CPU和内存开销的降低,这总归是好事。现代操作码缓存器(Optimizer+,APC2.0+,其他)使用共享内存进行存储,并且可以直接从中执行文件,而不用在执行前“反序列化”代码。这将带来显着的性能加速,通常特别是高流量和高并发量时降低了整体服务器的内存消耗,而且很少有缺点。

3、为什么要使用Opcode缓存?

这得从PHP代码的生命周期说起,请求PHP脚本时,会经过五个步骤,如下图所示:

Zend引擎必须从文件系统读取文件、扫描其词典和表达式、解析文件、创建要执行的计算机代码(称为Opcode),最后执行Opcode。每一次请求PHP脚本都会执行一遍以上步骤,如果PHP源代码没有变化,那么Opcode也不会变化,显然没有必要每次都重行生成Opcode,结合在Web中无所不在的缓存机制,我们可以把Opcode缓存下来,以后直接访问缓存的Opcode岂不是更快,启用Opcode缓存之后的流程图如下所示:

因此使用了Operate Code缓存之后,PHP代码会直接获取opcode后直接执行,中间的三个步骤会省略掉因此会大幅提高PHP代码执行效率

三、Opcache的安装和使用

1、安装

2、使用

3、配置

注意点:

It should be mentioned that opcache_reset() does not reset cache when executed via cli.

So `php-r "var_dump(opcache_reset());"` outputs "true" but doesn't clean cache. Make file, access it via http - and cache is clean.

清除缓存的时候, 需要使用http访问的方式来清理, cli模式下的清理无效

建议在开发环境中禁用opcache, 在生产环境开启

其他补充:

opcache.revalidate_freq

这个选项用于设置缓存的过期时间(单位是秒),当这个时间达到后,opcache会检查你的代码是否改变,如果改变了PHP会重新编译它,生成新的opcode,并且更新缓存。值为“0”表示每次请求都会检查你的PHP代码是否更新(这意味着会增加很多次stat系统调用,译注:stat系统调用是读取文件的状态,这里主要是获取最近修改时间,这个系统调用会发生磁盘I/O,所以必然会消耗一些CPU时间,当然系统调用本身也会消耗一些CPU时间)。可以在开发环境中把它设置为0,生产环境下不用管,因为下面会介绍另外一个设置选项。

opcache.validate_timestamps

当这个选项被启用(设置为1),PHP会在opcache.revalidate_freq设置的时间到达后检测文件的时间戳(timestamp)。

如果这个选项被禁用(设置为0),opcache.revalidate_freq会被忽略,PHP文件永远不会被检查。这意味着如果你修改了你的代码,然后你把它更新到服务器上,再在浏览器上请求更新的代码对应的功能,你会看不到更新的效果,你必须得重新加载你的PHP(使用kill -SIGUSR2强制重新加载)。

这个设定是不是有些蛋疼,但是我强烈建议你在生产环境中使用,why?因为当你在更新服务器代码的时候,如果代码较多,更新操作是有些延迟的,在这个延迟的过程中必然出现老代码和新代码混合的情况,这个时候对用户请求的处理必然存在不确定性。

opcache.max_accelerated_files

这个选项用于控制内存中最多可以缓存多少个PHP文件。这个选项必须得设置得足够大,大于你的项目中的所有PHP文件的总和。我的代码库大概有6000个PHP文件,所以我把这个值设置为一个素数7963。

真实的取值是在质数集合 { 223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987 } 中找到的第一个比设置值大的质数。 设置值取值范围最小值是 200,最大值在 PHP 5.5.6 之前是 100000,PHP 5.5.6 及之后是 1000000。

听起来好复杂,但用下面的命令就妥啦

你可以运行 find . -type f -print | grep php | wc -l 这个命令来快速计算你的代码库中的PHP文件数。

opcache.memory_consumption

这个选项的默认值为64MB,我把它设置为192MB,因为我的代码很大。你可以通过调用opcachegetstatus()来获取opcache使用的内存的总量,如果这个值很大,你可以把这个选项设置得更大一些。

opcache.interned_strings_buffer

这是一个很有用的选项,但是似乎完全没有文档说明。PHP使用了一种叫做字符串驻留(string interning)的技术来改善性能。例如,如果你在代码中使用了1000次字符串“foobar”,在PHP内部只会在第一使用这个字符串的时候分配一个不可变的内存区域来存储这个字符串,其他的999次使用都会直接指向这个内存区域。这个选项则会把这个特性提升一个层次——默认情况下这个不可变的内存区域只会存在于单个php-fpm的进程中,如果设置了这个选项,那么它将会在所有的php-fpm进程中共享。在比较大的应用中,这可以非常有效地节约内存,提高应用的性能。

这个选项的值是以兆字节(megabytes)作为单位,如果把它设置为16,则表示16MB,默认是4MB,这是一个比较低的值。

opcache.fast_shutdown

另外一个很有用但也没有文档说明的选项。从字面上理解就是“允许更快速关闭”。它的作用是在单个请求结束时提供一种更快速的机制来调用代码中的析构器,从而加快PHP的响应速度和PHP进程资源的回收速度,这样应用程序可以更快速地响应下一个请求。把它设置为1就可以使用这个机制了。

最终我们对于opcache在php.ini的设置如下:

开发模式下推荐,直接禁用opcache扩展更好

opcache.revalidate_freq=0

opcache.validate_timestamps=1

opcache.max_accelerated_files=3000

opcache.memory_consumption=192

opcache.interned_strings_buffer=16

opcache.fast_shutdown=1

多台机器集群模式或者代码更新频繁时推荐,可以兼顾性能,方便代码更新

opcache.revalidate_freq=300

opcache.validate_timestamps=1

opcache.max_accelerated_files=7963

opcache.memory_consumption=192

opcache.interned_strings_buffer=16

opcache.fast_shutdown=1

稳定项目推荐,性能最好

opcache.revalidate_freq=0

opcache.validate_timestamps=0

opcache.max_accelerated_files=7963

opcache.memory_consumption=192

opcache.interned_strings_buffer=16

opcache.fast_shutdown=1

opcache php 原理_php之Opcache相关推荐

  1. opcache php 原理_PHP加速器之opcache配置详解

    当解释器完成对脚本代码的分析后,便将它们生成可以直接运行的中间代码,也称为操作码(Operate Code,opcode).Opcode cache的目地是避免重复编译,减少CPU和内存开销.如果动态 ...

  2. opcache php 原理_PHP Opcache工作原理

    PHP项目中,尤其是在高并发大流量的场景中,如何提升PHP的响应时间,是一项十分重要的工作. 而Opcache又是优化PHP性能不可缺失的组件,尤其是应用了PHP框架的项目中,作用更是明显. 1. 概 ...

  3. opcache php 原理_PHP Opcache的工作原理

    PHP项目中,尤其是在高并发大流量的场景中,如何提升PHP的响应时间,是一项十分重要的工作. 而Opcache又是优化PHP性能不可缺失的组件,尤其是应用了PHP框架的项目中,作用更是明显. 1. 概 ...

  4. opcache php 原理_php性能加速之opcache

    什么是opcache OPcache 是一个通过将 PHP 脚本预编译的字节码存储到共享内存中来提升 PHP 的性能的PHP扩展. 存储预编译字节码的好处就是 省去了每次加载和解析 PHP 脚本的开销 ...

  5. php opcache文件还原,php7使用opcache把编译后的php文件存储为文件,实现php源码保护和脚本加速...

    工作原理: 备注: opcache.file_cache缓存为本地文件仅php7以后支持.php5未支持该配置,仅可用户脚本加速. 一.安装opcache. windows扩展下载地址 https:/ ...

  6. php mysql 编程原理_PHP开发的原理及优势介绍

    原标题:PHP开发的原理及优势介绍 在目前的网站开发语言中,比较常用的主要有:PHP.ASP ..NET.JSP等,使用最广泛的要数PHP语言了. PHP一种通用开源脚本语言.语法吸收了C语言.Jav ...

  7. php选择排序算法原理_PHP排序算法之选择排序

    二.选择排序 原理: 在一列数字中,选出最小数与第一个位置的数交换.然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止.(以下都是升序排列,即从小到大排列) ...

  8. php mysql 实现原理_PHP底层和mysql的通信原理

    要清楚的几个概念: FPM进程:进程数在php-fpm.ini中设置.没有设置 max_requests ,那么进程是不会销毁的,也就是说当一个进程里面出现死循环或者内存溢出等导致进程僵死的情况出现的 ...

  9. php mysql购物车实现原理_PHP实现购物车的思路和源码分析

    这里主要是记录下自己的购物车的思路,具体功能实现,但是尚未在实际项目中用到,不对之处欢迎指正 项目中需要添加购物车. 目录说明 buy.php 点击购买之后的操作 car.php 购物车,显示购买的东 ...

最新文章

  1. c#_序列化与反序列化的应用
  2. Cxf + Spring3.0 入门开发WebService
  3. android ProgressBar 使用方法
  4. cs1.5 linux服务端,Linux下架设CS1.5服务器
  5. [NOI2009]管道取珠
  6. 【英语学习】【Level 07】U02 Live Work L2 A place to call my home
  7. Android官方api的下载
  8. Linux脏牛漏洞提权复现
  9. js在线加密工具推荐
  10. PS如何快速修改证件照片底色
  11. PS通道抠图及选区白边处理
  12. 漫画:什么是 B+ 树?
  13. pta 机工士姆斯塔迪奥(C语言实现)
  14. SpringMVC里拦截器preHandle里的参数意思
  15. city code table广东_【考试|定了!2021年广东高中学考安排来了】招生|高考|普通高中|英语_热点...
  16. MySql学习笔记(2)--数据库操作及数据管理
  17. html第二章课后选择题答案,心理学基础第二章 课后习题
  18. 计算机硬件故障的维修方法,计算机硬件故障和维修方法分析.doc
  19. ROS2机器人个人教程博客汇总(2021共6套)
  20. 后门攻击阅读笔记,Graph Backdoor

热门文章

  1. asio 异步demo
  2. WIN10 右键 powershell 修改
  3. Python机器学习(三)--决策树算法
  4. 目标跟踪算法五:MDNet: Learning Multi-Domain Convolutional Neural Networks for Visual Tracking
  5. 青龙羊毛——小虎饿了(偷的)
  6. DiffServ实现技术
  7. 歌手比赛系统c语言程序注释,C语言程序课程设计—歌手比赛系统(20页)-原创力文档...
  8. python九十八类_Python领域最伟大工程师Kenneth Reitz,教你写代码
  9. 聊一聊 bootstrap 的轮播图插件
  10. 存储过程mysql into select into_mysql 存储过程select into select into select的搜索结果-阿里云开发者社区...