首页 > 编程语言 >PHP扩展 Opcache工作原理

PHP扩展 Opcache工作原理

时间:2022-12-07 14:57:21浏览次数:65  
标签:脚本 缓存 php 扩展 Opcache PHP opcache

PHP工作原理

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

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

  1. php初始化执行,启动zend引擎,加载已注册的扩展模块
  2. 读取脚本文件,zend引擎对脚本进行词法分析、语法分析、生成语法生成树
  3. zend引擎编译语法树,生成opcode中间代码
  4. 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

  

 

标签:脚本,缓存,php,扩展,Opcache,PHP,opcache
From: https://www.cnblogs.com/jimz/p/16963061.html

相关文章

  • MyBatisplus3.12.CRUD扩展:自动填充。乐观锁。分页查询。逻辑删除SpringBoot环境
    简介:大家好,我是枫哥,......
  • ES6笔记 - 原型对象扩展
    原型对象扩展目录原型对象扩展1.__proto__属性2.Object.setPrototypeOf()3.Object.getPrototypeOf()1.__proto__属性__proto__属性用来读取或设置当前对象的protot......
  • ES6笔记 - 扩展运算符
    扩展运算符目录扩展运算符1.数组中的扩展运算符1.1应用场景2.对象中的扩展运算符2.1应用场景3.解构赋值中【不一样的】扩展运算符4.浅拷贝问题1.数组中的扩展运算......
  • .NET 6 实现滑动验证码(四)、扩展类
    为了能够通过配置文件(appsettings.json)或通过代码进行背景图片与模板进行配置、可自定义资源类型、自定义验证规则,本节创建一些扩展类,用来实现这些功能。上一节内容:NET6......
  • php-fpm进程过多,导致CPU过高
    今天发现服务器的php-fpm进程突然过多,导致CPU过高,其他项目的访问受到影响。我通过以下三个基本步骤定位到了问题,发现了其原因。 基本步骤:先用top命令查看进程情况,找出......
  • php的pdo库使用总结
    <?phptry{$dsn="mysql:host=127.0.0.1;port=3306;dbname=test;charset=utf8";$user="root";$password="";#持久连接$pdo=newPDO($ds......
  • php中缩略图的问题
    以往在PHP中用缩略图上传,一直没留意到一个问题,就是:即使图片不大,比如不超过500K,但实际上在缩略图时,要占用很大的内存资源的,比如一张1600*1200*24B的图......
  • ES6笔记 - 函数参数扩展 与 箭头函数
    函数的扩展目录函数的扩展1.函数的默认值1.1解构赋值默认值与函数默认值1.2参数默认值的位置2.rest参数3.箭头函数3.1基础用法3.2箭头函数中的this3.3用途1.函......
  • 安装phpStudy后报错:Warning: session_start()...” 的解决方法
    在使用phpstudy的时候遇到以下报错:Warning:session_start():open(C:/ProgramFiles/php/sessiontemp\sess_0cde28de3ce1a2e2cc8e8723b5a40279,O_RDWR)failed:Permiss......
  • 查找linux下进程占用CPU过高的原因,以php-fpm为例
    很多时候,线上服务器的进程在某时间段内长时间占用CPU过高,为了优化,我们需要找出原因。1、找出占用CPU最高的10个进程psaux|sort-k3nr|head-n10或查看占用内存最高的1......