加入收藏 | 设为首页 | 会员中心 | 我要投稿 阜阳站长网 (https://www.0558zz.cn/)- AI行业应用、低代码、混合云存储、数据仓库、物联网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

深入分析PHP Opcache工作原理

发布时间:2022-08-11 11:50:07 所属栏目:PHP教程 来源:互联网
导读:PHP项目中,尤其是在高并发大流量的场景中,如何提升PHP的响应时间,是一项十分重要的工作。 而Opcache又是优化PHP性能不可缺失的组件,尤其是应用了PHP框架的项目中,作用更是明显。 1. 概述 在理解 OPCache 功能之前,我们有必要先理解PHP-FPM + Nginx 的
  PHP项目中,尤其是在高并发大流量的场景中,如何提升PHP的响应时间,是一项十分重要的工作。
 
  而Opcache又是优化PHP性能不可缺失的组件,尤其是应用了PHP框架的项目中,作用更是明显。
 
  1. 概述
  在理解 OPCache 功能之前,我们有必要先理解PHP-FPM + Nginx 的工作机制,以及PHP脚本解释执行的机制。
 
  1.1 PHP-FPM + Nginx 的工作机制
 
  请求从Web浏览器到Nginx,再到PHP处理完成,一共要经历如下五个步骤:
 
  第一步:启动服务
 
  启动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发送给第一个filter → 第二个 → 以此类推 → 最终响应发送给客户端
  1.2 PHP脚本解释执行的机制
 
  了解了PHP + Nginx 整体的处理流程后,我们接下来看一下PHP脚本具体执行流程,
 
  首先我们看一个实例:
 
 
 
 
 
 
 
 
 
  <?php
 
  if (!empty($_POST)) {
 
      echo "Response Body POST: ", json_encode($_POST), "n";
 
  }
 
   
 
  if (!empty($_GET)) {
 
      echo "Response Body GET: ", json_encode($_GET), "n";
 
  }
 
  我们分析一下执行过程:
 
  php初始化执行环节,启动Zend引擎,加载注册的扩展模块
 
  初始化后读取脚本文件,Zend引擎对脚本文件进行词法分析(lex),语法分析(bison),生成语法树
 
  Zend 引擎编译语法树,生成opcode,
 
  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 系统提供很多种进程间内存共享的方式:
 
  System-V shm API: System V共享内存,
  sysv shm是持久化的,除非被一个进程明确的删除,否则它始终存在于内存里,直到系统关机;
  mmap API:
  mmap映射的内存在不是持久化的,如果进程关闭,映射随即失效,除非事先已经映射到了一个文件上
  内存映射机制mmap是POSIX标准的系统调用,有匿名映射和文件映射两种
  mmap的一大优点是把文件映射到进程的地址空间
  避免了数据从用户缓冲区到内核page cache缓冲区的复制过程;
  当然还有一个优点就是不需要频繁的read/write系统调用

(编辑:阜阳站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读