Opcode 是啥?

我们先看一下 PHP 的执行过程:

  1. PHP 初始化执行环节,启动 Zend 引擎,加载注册的扩展模块。
  2. 初始化后读取 PHP 脚本文件,Zend 引擎对 PHP 文件进行词法分析,语法分析,生成语法树。
  3. Zend 引擎编译语法树,生成 Opcode
  4. Zend 引擎执行 Opcode,返回执行结果。

在 PHP-FPM 模式下,步骤 1 在启动时执行一次,后续的请求中不再执行;步骤 2 3 4每次请求都需要执行一遍。

2 和 3 生成的语法树和 Opcode ,同一个PHP 脚本每次运行的结果都是一样的。

OPcache 就是用来缓存 Opcode 的。

OPcache

OPCache 是 Zend 官方出品的,开放自由的 Opcode 缓存扩展,还具有代码优化功能,省去每次加载和解析 PHP 脚本的开销。

OPcache 通过将 PHP 脚本预编译的字节码存储到共享内存中来提升 PHP 的性能, 存储预编译字节码的好处就是 省去了每次加载和解析 PHP 脚本的开销。

PHP5.5.0以后的版本已经默认包含了 OPCache 扩展。

OPCache 缓存的机制主要是:将 PHP 编译产生的字节码以及数据缓存到共享内存中,在每次请求,从缓存中直接读取编译后的 opcode,进行执行。

OPcache 的更新策略

是缓存,都有过期时间。

OPCache 的更新策略非常简单,到期数据置为 Wasted,达到设定值,清空缓存,重建缓存。

因为在高流量的场景下,重建缓存是一件非常耗费资源的事情,所以建议:不要设置 OPcache 的过期时间

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

  • 不要在高峰期发布代码,这是任何情况下都要遵守的规则
  • 代码预热,比如使用脚本批量调 PHP 访问 URL,或者使用 OPCache 暴露的 API 如 opcache_compile_file() 进行编译缓存

Opcache 的安装

因为PHP5.5.0 以后的版本都已经默认安装了 OPCache,但是默认是没有开启的,需要手动开启。

开发方法:编辑 php.ini

;开启扩展
zend_extension=opcache.so
[opcache]
;允许在 web 环境使用
opcache.enable=1
;允许在 cli 环境使用
opcache.enable_cli=0

重启 PHP-FPM 和 Nginx。

service php7.2-fpm restart
service nginx restart

官网推荐的 php.ini的 OPCache 配置

;允许在 web 环境使用
opcache.enable=1
;允许在 cli 环境使用
opcache.enable_cli=1
;OPcache 的共享内存大小,以兆字节为单位。
opcache.memory_consumption=128
;用来存储预留字符串的内存大小,以兆字节为单位
opcache.interned_strings_buffer=8
;OPcache 哈希表中可存储的脚本文件数量上限
opcache.max_accelerated_files=4000
;检查脚本时间戳是否有更新的周期,以秒为单位。 设置为 0 会导致针对每个请求, OPcache 都会检查脚本更新。如果 opcache.validate_timestamps 配置指令设置为禁用,那么此设置项将会被忽略。
opcache.revalidate_freq=60

其他参数查看官网文档

参考

  1. PHP 官方 OPcache 扩展文档

  2. Opcode 是啥以及如何使用好 Opcache

  3. PHP OPcache工作原理

什么是 Opcache,如何使用 Opcache的更多相关文章

  1. php在5.5.0默认提供了Zend OPcache

    eaccelerator无法兼容php5.5.0,好在php在5.5.0默认提供了Zend OPcache,所以一直习惯eaccelerator的朋友如果要升级到php5.5.0的话,可能要暂时和ea ...

  2. 编译安装 Zend Opcache 缓存Opcache,加速 PHP

    Optimizer+ 是 Zend 开发的闭源但可以免费使用的 PHP 优化加速组件,是第一个也是最快的 opcode 缓存工具.现在,Zend 科技公司将 Optimizer+ 在 PHP Lice ...

  3. [PHP] - 性能加速 - 开启opcache

    说明 PHP 5.5+版本以上的,可以使用PHP自带的opcache开启性能加速(默认是关闭的).对于PHP 5.5以下版本的,需要使用APC加速,这里不说明,可以自行上网搜索PHP APC加速的方法 ...

  4. linux下安装opcache扩展

    linux下安装opcache扩展   参考:http://www.php.net/manual/zh/opcache.installation.php 1 2 3 4 5 6 7 wget http ...

  5. 使用Zend OpCache 提高 PHP 5.5+ 性能

    使用Zend OpCache 提高 PHP 5.5+ 性能 作者:admin | 时间:February 28, 2015 | 分类:Linux | 评论:1 评论 PHP 5.5 以后内建了 OpC ...

  6. nginx1.4.6+php5.5.11+mysql5.6.17+mecache+opcache

    要用到的软件:libiconv-1.13.tar.gz libmcrypt-2.5.8.tar.gz mcrypt-2.6.8.tar.gz mhash-0.9.9.9.tar.gz memcache ...

  7. 新一代 PHP 加速插件 Zend Opcache

    参考:http://www.laogui.com/Zend-Opcache 大家知道目前PHP的缓存插件一般有三个:APC.eAccelerator.XCache,但未来它们可能都会消失,因为PHP ...

  8. php Zend Opcache,xcache,eAccelerator缓存优化详解及对比

    XCACHE XCache 是一个开源的 opcode 缓存器/优化器, 这意味着他能够提高您服务器上的 PHP 性能. 他通过把编译 PHP 后的数据缓冲到共享内存从而避免重复的编译过程, 能够直接 ...

  9. opcache运行时配置参数详解

    PHP的opcode缓存又出 了新成员(说新不新,也有一段日子了),那就是opcache.新浪微博等都在使用,惠新宸老师强力推荐.本人最近根据官网地址 (http://www.php.net/manu ...

  10. 搭建LNMP发布ecshop系统及压测启用opcache缓存与否的情况

    安装环境:CENTOS6.5,nginx1.6.2,php-5.5.18,mysql5.5.38 在安装软件之前安装epel源,就可以直接用yum安装libmcrypt,mhash,mcrypt等ph ...

随机推荐

  1. Java 实例 - 获取本机ip地址及主机名

    package guyu.day0824; import java.net.InetAddress; /** * @Author: Fred * @Date: 2020/8/24 09:39 */ p ...

  2. lammps_data文件

    一.notes: 1.不在data文件里写“#”(注释),否则,容易出错: 2.前两行不用写东西(建议): 3.相互作用系数可以不用写在data里边(如pair_coeff等),可有可无,but fo ...

  3. WPF Devexpress控件库中ChartControl--实现不等距x轴

    一.概要 解决问题--ChartControl不等距x轴显示 二.CS代码 用过ChartControl的开发者们应该都知道,ChartControl中设置x轴间距间隔都是固定的数值. 比如(间隔10 ...

  4. Kubernetes K8S之通过yaml文件创建Pod与Pod常用字段详解

    YAML语法规范:在kubernetes k8s中如何通过yaml文件创建pod,以及pod常用字段详解 YAML 语法规范 K8S 里所有的资源或者配置都可以用 yaml 或 Json 定义.YAM ...

  5. Python技术调查

    1. IDE 2. Local Debugging & Remote Debugging 3. Profiling

  6. Web测试经典bug、安全性测试

    典型BUG 表格的排序.翻页.添加.删除的联合测试 输入框的长度检查 数据库表中如果指定utf8长度为150,则可以输入150个中文或英文字母等 (有时候界面判断失误,却只能输入50个汉字) 数据添加 ...

  7. Spring JPA 定义查询方法

    Spring JPA 定义查询方法 翻译:Defining Query Methods ​ 存储库代理有两种方式基于方法名派生特定域的查询方式: 直接从方法名派生查询 自定义查询方式 ​ 可用选项基于 ...

  8. 17_Python的常用模块

    1.随机数模块 random 1.随机小数 import random # (0,1)随机取浮点数 random.random() # 0.17988578778011 # (1, 3)取指定范围的浮 ...

  9. 在Oracle中十分钟内创建一张千万级别的表

    小表不会产生性能问题,大表才会.要练习SQL调优,还非得有大表不可.但数据不会自然产生,没有数据时如何创建一张千万级别的大表呢? 之前,我想用Oracle的批量插入语法去插入数据,此语法如下: INS ...

  10. ThinkPHP6.0 多应用模式 部署 Layuiadmin 单页版

    TP6.0中的路由省略应用名只能用入口文件绑定应用 和 域名绑定应用,经过测试,最后得出域名绑定应用是最合适的部署方式.如果有更好的部署方案,欢迎分享.QQ:23426945 1. 下载TP6.0,引 ...