opcache php 原理_PHP Opcache 工作原理

虽然是在疫情期间,但是我们还是要不断投资自己的大脑,这样才能在今后的职场道路中让自己更值钱。

PHP 工作原理

首先,我们先了解下解释型语言 PHP 的工作原理,这有利于我们了解 PHP Opcache。

对于 PHP,我们常用的是 cli 模式和 php-fpm 模式。下面我们拿 cli 模式来描述下 php 执行脚本的运行过程:

php 初始化执行,启动 zend 引擎,加载已注册的扩展模块

读取脚本文件,zend 引擎对脚本进行词法分析、语法分析、生成语法生成树

zend 引擎编译语法树,生成 opcode 中间代码

zend 引擎执行 opcode,返回执行结果

对于 cli 模式来说,每次执行 php 脚本,都会将以上流程完整执行一遍。

而对于 php-fpm 模式来说,php 初始化环节 (步骤 1) 会在 php-fpm 启动时执行,而之后的步骤则是会在每次请求执行时重复执行 (php-fpm+nginx 的工作原理,不了解的同学可以翻看一下之前的文章 nginx+php 执行请求的工作原理)。

对于大流量高并发项目来说,每次执行脚本或者请求时都需要重新编译固定不变的脚本文件,生成固定的 opcode,确实有些浪费资源了,所以 opcache 应运而生。

PHP Opcache

Opcache,简单来说,是 php 应对每次都需要重复编译的脚本文件而开发的组件,可以节省上文所说的解析脚本文件的开销。

Opcache 缓存的内容

目前,Opcache 缓存的内容包括:

Opcode

Interned String (可以理解为 php 请求生命周期中不需要释放的 String,包括:变量名、类名、方法名、字符串、注释等)

Opcache 工作原理

Opcache 工作原理其实是使用了共享内存机制,将需要缓存的内容放入到共享内存中,供其他进程使用。

因为 Opcache 在创建缓存的过程中不会阻止其他进程读取,所以在使用 Opcache 时要注意两点,不然会大量消耗资源:

不要给 Opcache 设置过期时间

不要在流量高峰期发布代码

切记!

Opcache 配置

说了这么多,下面我们来看下 Opcache 如何配置呢?

Opcache 配置是放置在 php.ini 文件中的 (没有安装该扩展的同学可以自行百度安装该扩展),我们接下来主要讲解一些重要的配置,以来提升 PHP 整体性能。

//添加Opcache扩展

zend_extension=opcache.so

//开启Opcache

opcache.enable=1

//cli环境下启用Opcache

opcache.enable_cli=1

//浪费内存的上限,以百分比计,如果达到该上限,Opcache则会清空并重新生成缓存。默认5%

opcache.max_wasted_percentage=5

//配置共享内存存储大小,单位MB

opcache.memory_consumption=128

//用来存储临时字符串的内存大小,单位MB。这个配置就是上面说到的Opcache缓存的interned_string,它会在第一次使用到interned_string时缓存到共享内存中,供其他进程后续使用

opcache.interned_strings_buffer=8

//用于控制共享内存最多可以缓存多少个文件,该值最小范围是200,在php5.5.6版本之后,最大值是1000000

opcache.max_accelerated_files=4000

//设置缓存的过期时间,为0的话则每次都要检查

opcache.revalidate_freq=60

//如果启用,OPcache会在opcache.revalidate_freq设置的秒数去检测文件的时间戳(timestamp)检查脚本是否更新。如果这个选项被禁用(设置为0),opcache.revalidate_freq会被忽略,PHP文件永远不会被检查。这意味着如果你修改了你的代码,然后你把它更新到服务器上,再在浏览器上请求更新的代码对应的功能,你会看不到更新的效果

opcache.validate_timestamps=0 //所以像我上面说的,在大流量高并发场景下,该项不要启用,切记

//启用后,可以将依赖Zend引擎的内存管理模块一次释放全部请求变量的内存,而不是依次释放每一个已分配的内存块。

opcache.fast_shutdown=1

//启用文件缓存(设置缓存路径),这样Opcache就可以将Opcode缓存到文件中,实现跨php生命周期缓存

opcache.file_cache=/tmp

总结

经历过 19 年的裁员和 20 年的疫情之后,我们应该明白只有不断投资自己才是最重要的。只有不断提升自己,才能让自己应对不可控的变化!

最后,祝愿大家在新的一年里都能找到自己诚心如意的好工作。也欢迎大家关注我的微信公众号和专栏:许铮的技术成长之路 (id:xavier-tech-growth),来一起学习技术知识。我的成长也许也是你的~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值