iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >PHP中Opcache的工作原理是什么
  • 512
分享到

PHP中Opcache的工作原理是什么

2023-06-22 08:06:48 512人浏览 泡泡鱼
摘要

小编给大家分享一下PHP中Opcache的工作原理是什么,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!php项目中,尤其是在高并发大流量的场景中,如何提升PHP的响应时间,是一项十分重要的工作。而Opcache又是优化PH

小编给大家分享一下PHP中Opcache的工作原理是什么,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

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脚本具体执行流程,

首先我们看一个实例:

<?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 系统提供很多种进程间内存共享的方式:

  • System-V shm api: System V共享内存,

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

  • mmap API:

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

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

    • mmap的一大优点是把文件映射到进程的地址空间

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

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

  • POSIX API: System V 的共享内存是过时的, POSIX共享内存提供了使用更简单、设计更合理的API.

  • Unix socket API

OPCache 使用了前三个共享内存机制,根据配置或者默认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 会选择适用的模块, 通常情况下,自动选择就可以满足需求。可选值包括: mmapshm, 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 } 中找到的第一个大于等于设置值的质数。 设置值取值范围最小值是 200,最大值在 PHP 5.5.6 之前是 100000,PHP 5.5.6 及之后是 1000000。默认值2000

  • opcache.max_file_size=0 以字节为单位的缓存的文件大小上限。设置为 0 表示缓存全部文件。默认值0

6.3 注释相关的缓存

  • opcache.load_comments boolean 如果禁用,则即使文件中包含注释,也不会加载这些注释内容。 本选项可以和 opcache.save_comments 一起使用,以实现按需加载注释内容。

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

6.4 二级缓存的配置

  • opcache.file_cache 配置二级缓存目录并启用二级缓存。 启用二级缓存可以在 SHM 内存满了、服务器重启或者重置 SHM 的时候提高性能。 默认值为空字符串 "",表示禁用基于文件的缓存。

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

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

  • opcache.file_cache_fallback booleanwindows 平台上,当一个进程无法附加到共享内存的时候, 使用基于文件的缓存,也即:opcache.file_cache_only=1。 需要显示的启用文件缓存。

看完了这篇文章,相信你对“PHP中Opcache的工作原理是什么”有了一定的了解,如果想了解更多相关知识,欢迎关注编程网PHP编程频道,感谢各位的阅读!

--结束END--

本文标题: PHP中Opcache的工作原理是什么

本文链接: https://www.lsjlt.com/news/303547.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • PHP中Opcache的工作原理是什么
    小编给大家分享一下PHP中Opcache的工作原理是什么,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!PHP项目中,尤其是在高并发大流量的场景中,如何提升PHP的响应时间,是一项十分重要的工作。而Opcache又是优化PH...
    99+
    2023-06-22
  • PHP opcache的原理及使用方法是什么
    这篇文章主要介绍了PHP opcache的原理及使用方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇PHP opcache的原理及使用方法是什么文章都会有所收获,下面我们一起来看看吧。PHP项目中,尤其...
    99+
    2023-07-05
  • php中switch语句的工作原理是什么
    这篇文章主要介绍“php中switch语句的工作原理是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“php中switch语句的工作原理是什么”文章能帮助大家解决问题。php中switch语句用于...
    99+
    2023-06-26
  • PHP中load函数的工作原理是什么?
    在PHP中,load函数是一个非常常用的函数,它的主要作用是将一个指定的文件包含进来。在本文中,我们将深入探讨load函数的工作原理,以及如何使用它来提高我们的编程效率。 load函数的基本语法如下: void load ( string...
    99+
    2023-09-18
    load 数据类型 api
  • PHP中ereg_replace()函数的工作原理是什么
    这期内容当中小编将会给大家带来有关PHP中ereg_replace()函数的工作原理是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。PHP ereg_replace()函数原型:string ereg...
    99+
    2023-06-17
  • PHP底层工作原理是什么
    这篇文章将为大家详细讲解有关PHP底层工作原理是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。PHP底层工作原理图1 php结构从图上可以看出,php从下到上是一个4层体系①Zend引擎Zend整体用...
    99+
    2023-06-17
  • php迭代器的工作原理是什么
    这篇文章主要讲解了“php迭代器的工作原理是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php迭代器的工作原理是什么”吧!工作原理在第一次迭代之前,运行iterator::rewind...
    99+
    2023-06-20
  • Angular中zone.js的工作原理是什么
    这篇文章主要介绍“Angular中zone.js的工作原理是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Angular中zone.js的工作原理是什么”文章能...
    99+
    2024-04-02
  • c#中filter的工作原理是什么
    在C#中,filter通常指的是LINQ中的Where方法,用于筛选集合中符合条件的元素。其工作原理是通过传入一个谓词(P...
    99+
    2024-04-02
  • Android中AsyncTask的工作原理是什么
    这篇文章给大家分享的是有关Android中AsyncTask的工作原理是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。概述实际上,AsyncTask内部是封装了Thread和Handler。虽然AsyncTa...
    99+
    2023-06-15
  • python中WSGI的工作原理是什么
    这篇文章将为大家详细讲解有关python中WSGI的工作原理是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。python可以做什么Python是一种编程语言,内置了许多有效的工具,Python几乎无所...
    99+
    2023-06-14
  • Android中的SurfaceFlinger工作原理是什么
    这篇文章将为大家详细讲解有关Android中的SurfaceFlinger工作原理是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。概念SurfaceFlinger是一个系统服务,如:au...
    99+
    2023-06-22
  • puppet的工作原理是什么
    今天小编给大家分享一下puppet的工作原理是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Puppet 的介绍什么是P...
    99+
    2023-06-28
  • php反序列化的工作原理是什么
    PHP反序列化是指将经过序列化后的数据重新转换为原来的数据结构的过程。在PHP中,可以使用serialize()函数将数据序列化为字...
    99+
    2024-04-02
  • NTPD的工作原理是什么
    今天小编给大家分享一下NTPD的工作原理是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Network Time Pro...
    99+
    2023-06-28
  • Torrents的工作原理是什么
    本篇内容主要讲解“Torrents的工作原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Torrents的工作原理是什么”吧!Torrents 是如何工作的?假设 &lsquo;...
    99+
    2023-06-27
  • RabbitMQ的工作原理是什么
    这篇文章给大家介绍RabbitMQ的工作原理是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。RabbitMQ简介在介绍RabbitMQ之前实现要介绍一下MQ,MQ是什么?MQ全称是Message Queue,可以理...
    99+
    2023-06-19
  • ipsec的工作原理是什么
    IPSec(Internet Protocol Security)是一种用于保护网络通信安全的协议套件。它可以提供数据加密、数据完整...
    99+
    2023-10-10
    ipsec
  • prometheus的工作原理是什么
    Prometheus 是一种开源的监控系统,用于记录实时的指标数据。其工作原理主要包括以下几个步骤: 采集数据:Promethe...
    99+
    2024-03-12
    Prometheus
  • HDFS的工作原理是什么
    这篇文章将为大家详细讲解有关HDFS的工作原理是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。HDFS的工作原理HDFS支持在计算节点之间快速传输数据。在开始阶段,它与MapReduce紧密耦合——M...
    99+
    2023-06-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作