天涯论坛

 找回密码
 立即注册
搜索
查看: 22|回复: 0

[精选] 面试PHP主管岗位的时候,问我PHP的opcache是用来干吗的?

[复制链接]

2986

主题

3万

回帖

9956万

积分

论坛元老

Rank: 8Rank: 8

积分
99569168
发表于 2024-10-4 19:23:40 | 显示全部楼层 |阅读模式

举荐关注

以下请在本公众号里操作,商务合作请微X2230304070

回复「微X群」

加入PHP技术交流群,一块学习交流

回复「资料」

免费获取 PHP 等语言学习视频课程。

回复「文档」

免费获取 PHP 等语言电子文档

回复「激活码」

免费获取 phpStorm2021版 专属激活码。

opcache从字面意思,肯定是缓存这一起的。然则是不是晓得它的工作原理是怎么样的呢?这儿一点一点让你认识

PHP项目中,尤其是在高并发大流量的场景中,怎样提高PHP的响应时间,是一项非常重要的工作。而Opcache又是优化PHP性能不可缺失的组件,尤其是应用了PHP框架的项目中,功效更加是显著1. 概述在理解 OPCache 功能之前,咱们有必要先理解PHP-FPM + Nginx 的工作机制,以及PHP脚本解释执行的机制。1.1 PHP-FPM + Nginx 的工作机制请求从Web浏览器到Nginx,再到PHP处理完成,一共要经历如下五个过程第1步:起步服务

起步PHP-FPM。PHP-FPM 支持两种通信模式:TCP socket和Unix socket;

PHP-FPM 会起步两种类型的进程:Master 进程 和 Worker 进程,前者负责监控端口、分配任务、管理Worker进程;后者便是PHP的cgi程序,负责解释编译执行PHP脚本。

起步Nginx。首要会载入 ngx_http_fastcgi_module 模块,初始化FastCGI执行环境,实现FastCGI协议请求代理

这儿重视:fastcgi的worker进程(cgi进程),是由于PHP-FPM来管理,不是Nginx。Nginx只是代理

第二步:Request => Nginx

Nginx 接收请求,并基于location配置,选取一个合适handler

这儿便是代理PHP的 handler

第三步:Nginx => PHP-FPM

Nginx 把请求翻译成fastcgi请求

经过TCP socket/Unix Socket 发送给PHP-FPM 的master进程

第四步:PHP-FPM Master => Worker

PHP-FPM master 进程接收到请求

分配Worker进程执行PHP脚本,倘若空闲的Worker,返回502错误

Worker(php-cgi)进程执行PHP脚本,倘若超时,返回504错误

处理结束,返回结果

第五步:PHP-FPM Worker => Master => Nginx

PHP-FPM Worker 进程返回处理结果,并关闭连接,等待下一个请求

PHP-FPM Master 进程经过Socket 返回处理结果

Nginx Handler次序将每一个响应buffer发送给第1个filter → 第二个 → 以此类推 → 最后响应发送给客户端

1.2 PHP脚本解释执行的机制认识了PHP + Nginx 整体的处理流程后,咱们接下来看一下PHP脚本详细执行流程,首要咱们看一个实例:<?phpif (!empty($_POST)) { echo "Response Body POST: ", json_encode($_POST), "\n";}if (!empty($_GET)) { echo "Response Body GET: ", json_encode($_GET), "\n";}咱们分析一下执行过程:1.php初始化执行环节,起步Zend引擎,加载注册的扩展模块2.初始化后读取脚本文件,Zend引擎对脚本文件进行词法分析(lex),语法分析(bison),生成语法树3.Zend 引擎编译语法树,生成opcode,4.Zend 引擎执行opcode,返回执行结果在PHP cli模式下,每次执行PHP脚本,四个过程都会依次执行一遍;在PHP-FPM模式下,过程1)在PHP-FPM起步时执行一次,后续的请求中再也不执行;过程2)~4)每一个请求都要执行一遍;其实过程2)、3)生成的语法树和opcode,同一个PHP脚本每次运行的结果都是同样的,在PHP-FPM模式下,每次请求都要处理一遍,是对系统资源极重的浪费,那样办法优化呢?当然有,如:

OPCache:前身是Zend Optimizer+ ,是 Zend Server 的一个开源组件;官方出品,强力举荐

APC:Alternative PHP Cache 是一个开放自由的 PHP opcode 缓存组件,用于缓存、优化 PHP 中间代码;已然不更新了不举荐

APCu:是APC的一个分支,共享内存,缓存用户数据,不可缓存opcode,能够协同Opcache 运用

eAccelerate:一样是不更新了,不举荐

xCache:再也不举荐运用

2. OPCache 介绍OPCache 是Zend官方出品的,开放自由的 opcode 缓存扩展,还拥有代码优化功能,省去了每次加载和解析 PHP 脚本的开销。PHP 5.5.0 及后续版本中已然绑定了 OPcache 扩展。缓存两类内容:

OPCode

Interned String,如注释、变量名等

3. OPCache 原理OPCache缓存的机制重点是:将编译好的操作码放入共享内存,供给给其他进程拜访这儿触及到内存共享机制,另一所有内存资源操作都有锁的问题,咱们一一诠释3.1 共享内存UNIX/Linux 系统供给非常多种进程间内存共享的方式:1.System-V shm API: System V共享内存,

sysv shm是持久化的,除非被一个进程知道的删除,否则它始终存在于内存里,直到系统关机;

2.mmap API:

mmap映射的内存在不是持久化的,倘若进程关闭,映射随即失效,除非事先已然映射到了一个文件上

内存映射机制mmap是POSIX标准的系统调用,有匿名映射和文件映射两种

mmap的一大优点是把文件映射到进程的位置空间

避免了数据从用户缓冲区到内核page cache缓冲区的复制过程;

当然还有一个优点便是不需要频繁的read/write系统调用

3.POSIX API:System V 的共享内存是过时的, POSIX共享内存供给运用更简单、设计更恰当的API.4.Unix socket APIOPCache 运用了前三个共享内存机制,按照配置默认mmap 内存共享模式。依据PHP字节码缓存的场景,OPCache的内存管理设计非常简单,快速读写,不释放内存,过期数据置为Wasted。当Wasted内存大于设定值时,自动重启OPCache机制,清空并重新生成缓存。3.2 互斥锁任何内存资源的操作,都触及到锁的机制。共享内存:一个单位时间内,只准许一个进程执行写操作,准许多个进程执行读操作;写操作同期,不阻止读操作,以至于很少有锁死的状况这就诱发另一一个问题:新代码、大流量场景,进程排队执行缓存opcode操作;重复写入,引起资源浪费。4. OPCache 缓存诠释OPCache 是官方的Opcode 缓存处理方法,在PHP5.5版本之后,已然打包到PHP源码中一块发布。它将PHP编译产生的字节码以及数据缓存到共享内存中, 在每次请求,从缓存中直接读取编译后的opcode,进行执行。经过节省脚本的编译过程,加强PHP的运行效率。倘若正在运用APC扩展,做同样的工作,此刻剧烈举荐OPCache来代替,尤其是PHP7中。4.1 OPCode 缓存Opcache 会缓存OPCode以及如下内容:

PHP脚本触及到的函数

PHP脚本中定义的Class

PHP脚本文件路径

PHP脚本OPArray

PHP脚本自己结构/内容

4.2 Interned String 缓存首要咱们需要理解,什么是 Interned String?在PHP5.4的时候, 引入了Interned String机制, 用于优化PHP对字符串的存储和处理。尤其是处理大块的字符串,例如PHP doces时,Interned String 能够优化内存。Interned String 缓存的内容包含:变量名叫作、类名、办法名、字符串、注释等。在PHP-FPM模式中,Interned String 缓存字符,仅限于Worker 进程内部。而缓存到OPCache中,那样Worker进程之间能够运用 Interned String 缓存的字符串,节省内存。咱们需要重视一个事情,在PHP研发中,通常会有大段的注释,会被缓存到OPCache中。能够经过php.ini的配置,关闭注释的缓存。然则,像Zend Framework等框架中,会引用注释,因此是不是关闭注释的缓存,需要区别对待。5. OPCache 更新策略是缓存,都存在过期,以及更新策略等。而OPCache的更新策略非常简单,到期数据置为Wasted,达到设定值,清空缓存,重建缓存。这儿需要重视:在高流量的场景下,重建缓存是一件非常耗费资源的事儿。OPCache 在创建缓存时并不会阻止其他进程读取。这会引起海量进程反复新建缓存。因此,不要设置OPCache过期时间每次发布新代码时,都会显现反复新建缓存的状况怎样避免呢?

不要在高峰期发布代码,这是任何状况下都要遵守的规则

代码预热,例如运用脚本批量调PHP 拜访URL,运用OPCache 暴露的API 如opcache_compile_file() 进行编译缓存

6. OPCache 的配置6.1 内存配置

opcache.preferred_memory_model="mmap" OPcache 首选的内存模块。倘若留空,OPcache 会选取适用的模块, 一般状况下,自动选取能够满足需要。可选值包含:mmap,shm, posix 以及 win32。

opcache.memory_consumption=64 OPcache 的共享内存体积,以兆字节为单位,默认64M

opcache.interned_strings_buffer=4 用来存储临时字符串的内存体积,以兆字节为单位,默认4M

opcache.max_wasted_percentage=5 浪费内存的上限,以百分比计。倘若达到此上限,那样 OPcache 将产生重新起步续发事件。默认5

6.2 准许缓存的文件数量以及体积

opcache.max_accelerated_files=2000 OPcache 哈希表中可存储的脚本文件数量上限。真实的取值是在质数集合 { 223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987 } 中找到的第1个大于等于设置值的质数。设置值取值范围最小值是 200,最大值在 PHP 5.5.6 之前是 100000,PHP 5.5.6 及之后是 1000000。默认值2000

opcache.max_file_size=0 以字节为单位的缓存的文件体积上限。设置为 0 暗示缓存所有文件。默认值0

6.3 注释关联的缓存

opcache.load_commentsboolean 倘若禁用,则即使文件中包括注释,不会加载这些注释内容。本选项能够和 opcache.save_comments 一块运用,以实现按需加载注释内容。

opcache.fast_shutdown boolean 倘若启用,则会运用快速停止续发事件。所说快速停止续发事件指的是依赖 Zend 引擎的内存管理模块 一次释放所有请求变量的内存,而不是依次释放每一个已分配的内存块。

6.4 二级缓存的配置

opcache.file_cache 配置二级缓存目录并启用二级缓存。启用二级缓存能够在 SHM 内存满了、服务器重启重置 SHM 的时候加强性能。默认值为空字符串 "",暗示禁用基于文件的缓存。

opcache.file_cache_onlyboolean 启用或禁用在共享内存中的 opcode 缓存。

opcache.file_cache_consistency_checksboolean 当从文件缓存中加载脚本的时候,是不是对文件的校验和进行验证。

opcache.file_cache_fallbackboolean 在 Windows 平台上,当一个进程没法附加到共享内存的时候, 运用基于文件的缓存,即:opcache.file_cache_only=1。需要表示的启用文件缓存。

原文链接:http://kevhu.com/php/551

点个赞

再走吧





上一篇:​城隍庙是干什么的
下一篇:CFA证书是干什么的?能做什么工作?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站点统计|Archiver|手机版|小黑屋|天涯论坛 ( 非经营性网站 )|网站地图

GMT+8, 2024-11-23 01:03 , Processed in 0.128875 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.