PHP opcache的原理及使用方法是什么

发布时间:2023-03-22 16:34:31 作者:iii
来源:亿速云 阅读:98

这篇文章主要介绍了PHP opcache的原理及使用方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇PHP opcache的原理及使用方法是什么文章都会有所收获,下面我们一起来看看吧。

PHP项目中,尤其是在高并发大流量的场景中,如何提升PHP的响应时间,是一项十分重要的工作。
而Opcache又是优化PHP性能不可缺失的组件,尤其是应用了PHP框架的项目中,作用更是明显。

1、概述

在理解 OPCache 功能之前,我们有必要先理解PHP-FPM + Nginx 的工作机制,以及PHP脚本解释执行的机制。

1.1 PHP-FPM + Nginx 的工作机制

请求从Web浏览器到Nginx,再到PHP处理完成,一共要经历如下五个步骤:
第一步:启动服务

第二步:Request => Nginx

第三步:Nginx => PHP-FPM

第四步:PHP-FPM Master => Worker

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

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";
   }

我们分析一下执行过程:
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模式下,每次请求都要处理一遍,是对系统资源极大的浪费,那么有没有办法优化呢?
当然有,如:

2. OPCache 介绍

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

3 . OPCache 原理

OPCache缓存的机制主要是:将编译好的操作码放入共享内存,提供给其他进程访问。这里就涉及到内存共享机制,另外所有内存资源操作都有锁的问题,我们一一解读。

3.1 共享内存

UNIX/Linux 系统提供很多种进程间内存共享的方式:

1.System-V shm API: System V共享内存
sysv shm是持久化的,除非被一个进程明确的删除,否则它始终存在于内存里,直到系统关机;
2.mmap API:

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

4.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以及如下内容:

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过期时间

每次发布新代码时,都会出现反复新建缓存的情况。如何避免呢?

6. OPCache 的配置

6.1 内存配置

6.2 允许缓存的文件数量以及大小

6.3 注释相关的缓存

6.4 二级缓存的配置

关于“PHP opcache的原理及使用方法是什么”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“PHP opcache的原理及使用方法是什么”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注亿速云行业资讯频道。

推荐阅读:
  1. PHP代码编译为OPCODE
  2. 在PHP5.5.34版本中启用Zend Opcache

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

php opcache

上一篇:PHP跨域问题如何解决

下一篇:怎么用PHP将字符串转换为小写

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》