php开启opcache

2023-11-03

1.简介

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

注意: 如果需要将 » Xdebug 扩展和 OPcache 一起使用,必须在 Xdebug 扩展之前加载 OPcache 扩展。

2.安装

1.在php.ini文件中

zend_extension=opcache.so 
opcache.enable=1 
opcache.enable_cli=1

2.重启php-fpm和apache,
在这里插入图片描述
php.ini文件opcache参数:

配置php.ini
[Zend Opcache]
zend_extension = /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/opcache.so
opcache.enable=1 ;启用操作码缓存
opcache.enable_cli=1 ;仅针对CLI环境启用操作码缓存
opcache.memory_consumption=128 ;共享内存大小,单位MB
opcache.interned_strings_buffer=8 ;存储临时字符串的内存大小,单位MB
opcache.max_accelerated_files=4000 ;哈希表中可存储的脚本文件数量上限
;opcache.max_wasted_percentage=5 ;浪费内存的上限,以百分比计
;opcache.use_cwd=1;附加改脚本的工作目录,避免同名脚本冲突
opcache.validate_timestamps=1 ;每隔revalidate_freq 设定的秒数 检查脚本是否更新
opcache.revalidate_freq=60 ;
;opcache.revalidate_path=0 ;如果禁用此选项,在同一个 include_path 已存在的缓存文件会被重用
;opcache.save_comments=1 ;禁用后将也不会加载注释内容
opcache.fast_shutdown=1 ;一次释放全部请求变量的内存
opcache.enable_file_override=0 ; 如果启用,则在调用函数file_exists(), is_file() 以及 is_readable() 的时候, 都会检查操作码缓存
;opcache.optimization_level=0xffffffff ;控制优化级别的二进制位掩码。
;opcache.inherited_hack=1 ;PHP 5.3之前做的优化
;opcache.dups_fix=0 ;仅作为针对 “不可重定义类”错误的一种解决方案。
;opcache.blacklist_filename="" ;黑名单文件为文本文件,包含了不进行预编译优化的文件名
;opcache.max_file_size=0 ;以字节为单位的缓存的文件大小上限
;opcache.consistency_checks=0 ;如果是非 0 值,OPcache 将会每隔 N 次请求检查缓存校验和
opcache.force_restart_timeout=180 ; 如果缓存处于非激活状态,等待多少秒之后计划重启。
;opcache.error_log="" ;OPcache模块的错误日志文件
;opcache.log_verbosity_level=1 ;OPcache模块的日志级别。致命(0)错误(1) 警告(2)信息(3)调试(4)
;opcache.preferred_memory_model="" ;OPcache 首选的内存模块。可选值包括: mmap,shm, posix 以及 win32。
;opcache.protect_memory=0 ;保护共享内存,以避免执行脚本时发生非预期的写入。 仅用于内部调试。
;opcache.mmap_base=null ;在Windows 平台上共享内存段的基地址

下面内容来自:[公众号](https://mp.weixin.qq.com/s/LS3xMPO2QHn7Si3h1xFL8Q)

. OPCache 介绍


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

PHP 5.5.0 及后续版本中已经绑定了 OPcache 扩展。

缓存两类内容:

  • OPCode

  • Interned String,如注释、变量名等

二. OPCache 原理

OPCache缓存的机制主要是:将编译好的操作码放入共享内存,提供给其他进程访问。

这里就涉及到内存共享机制,另外所有内存资源操作都有锁的问题,我们一一解读。

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机制,清空并重新生成缓存。

2 互斥锁

任何内存资源的操作,都涉及到锁的机制。

共享内存:一个单位时间内,只允许一个进程执行写操作,允许多个进程执行读操作;

写操作同时,不阻止读操作,以至于很少有锁死的情况。

这就引发另外一个问题:新代码、大流量场景,进程排队执行缓存opcode操作;重复写入,导致资源浪费。

三. OPCache 缓存解读

OPCache 是官方的Opcode 缓存解决方案,在PHP5.5版本之后,已经打包到PHP源码中一起发布。

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

通过节省脚本的编译过程,提高PHP的运行效率。

如果正在使用APC扩展,做同样的工作,现在强烈推荐OPCache来代替,尤其是PHP7中。

1 OPCode 缓存

  • Opcache 会缓存OPCode以及如下内容:

  • PHP脚本涉及到的函数

  • PHP脚本中定义的Class

  • PHP脚本文件路径

  • PHP脚本OPArray

  • PHP脚本自身结构/内容

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等框架中,会引用注释,所以,是否关闭注释的缓存,需要区别对待。

四. OPCache 更新策略

是缓存,都存在过期,以及更新策略等。

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

这里需要注意:在高流量的场景下,重建缓存是一件非常耗费资源的事儿。

OPCache 在创建缓存时并不会阻止其他进程读取。

这会导致大量进程反复新建缓存。所以,不要设置OPCache过期时间

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

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

  • 代码预热,比如使用脚本批量调PHP 访问URL,或者使用OPCache 暴露的API 如opcache_compile_file() 进行编译缓存

五. OPCache 的配置

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

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

3 注释相关的缓存

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

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

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。需要显示的启用文件缓存。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

php开启opcache 的相关文章

  • document.querySelectorAll("input[type=checkbox") 的结果数组的顺序是否有保证?

    我在页面正文中有以下 HTML 这些是此 HTML 页面上类型复选框的唯一输入 fieldset legend North Face legend N A1 fieldset
  • WordPress 简码传递值数组

    我正在创建一些 WordPress 短代码 旨在在页面上提供内部导航 一个页面包含很多内容部分及其自己的菜单 这就是我所拥有的 menu function internal menu atts extract shortcode atts
  • PHP SNMP - 找不到模块

    我已启用 SNMP 模块并尝试使用该模块中的功能 我已将 MIBDIRS 环境变量设置为我的 mib 所在的位置 但我仍然收到这些 找不到模块 警告 Cannot find module IP MIB At line 0 in none C
  • Laravel 5 Auth 注销不起作用

    当我使用内置身份验证并尝试在以下位置注销用户时 auth logout 它没有像希望的那样工作 它似乎让用户保持登录状态 但是当我清除浏览器缓存时 我可以看到实际上已经将用户注销了 我在页面上没有收到任何错误 在日志文件中也没有收到任何错误
  • 通过删除空 GET 变量并简化变量名称来缩短 URL

    我正在开发一个网站 在提交后组成一个 URLGET form 表单值作为一组变量传递 其中必须至少定义一个变量才能在数据库上进行搜索 我想将网址缩短为删除空表单元素并使其更加用户友好简化变量名称 目前 URL 如下所示 只是带有更多变量 我
  • 枚举 PHP DOMDocument 对象的已注册命名空间

    对于我的一个项目 我正在使用DOMDocument类来加载和操作 XML 文档 我需要检索文档中使用的每个名称空间 但是 我找不到如何做到这一点 这DOMDocument类具有获取 URI 的命名空间前缀或命名空间前缀的 URI 的方法 但
  • {{ Auth::user()->name }} 如何在 Blade 文件中打印用户名?

    我一直在 laravel 中使用默认身份验证功能 我在一个刀片文件中发现 Auth user gt name 能够显示存储在用户表中的名称 但我想知道的是它是如何显示的用雄辩的口号在刀锋中呼唤名字 你可以像这样使用它 auth gt use
  • 使用ip地址访问时删除index.php

    我在服务器上上传了 codeigniter 项目 从 URL 中删除 index php 不起作用 我使用IP地址访问它 喜欢http ip http ip地址 下面是我的htaccess
  • 如何从 PHP 输出 XML 字符串

    我正在获取一个 XML 字符串并在 PHP 中对其进行编辑 以便在访问 PHP 文件时最终输出编辑后的 XML 字符串 我一直在尝试使用 echo 和 print 来输出 XML 文档 但它只打印最里面标签内的数据 我希望它的功能就像直接加
  • Laravel 在 Eloquent 范围和查询中使用 select

    我正在尝试清理我编写的一些代码 这是当前的代码 message Message with comments gt join users messages created by users id gt join team user messa
  • PHP 选择后立即删除

    我有一个 PHP 服务器脚本 它从 MySQL 数据库中选择一些数据 一旦我将 mysql query 和 mysql fetch assoc 的结果存储在我自己的局部变量中 我就想删除我刚刚选择的行 这种方法的问题在于 PHP 似乎对我的
  • 将记录分成两列

    我的数据库中有一个 学生 表 其中包含大约 5 000 条记录 我想将这些记录显示在two分区 如何在不执行查询两次的情况下做到这一点 仅使用单个查询 显示示例http www freeimagehosting net uploads f1
  • 如何修复网站 iframe 错误?

    当我访问此网址时 警告 推荐使用一些广告拦截器 网页链接加载良好 没有错误 但是 当我尝试通过加载同一页面时iframe在我的html代码中 出现错误 我的html代码
  • 为什么我的函数将布尔值更改为“on”?

    所以我是 php 编程世界的新手 我正在在线学习和其他形式等 但我找不到任何东西来帮助回答我的问题 这就是我在这里的原因 任何帮助当然不胜感激 谢谢 我想将下面的代码变成我可以调用的函数 它的工作原理如下所示 如果我选中表单中的复选框 它会
  • 为什么index.html优先于index.php?

    我在服务器上有一个网站 主页是 example com index php 好的 我将一个名为 index html 的文件上传到服务器 根目录 当我在浏览器的 URL 栏中输入站点的域时 我感到惊讶 因为 index html 页面已加载
  • 从 XML 节点 PHP DOM 中删除所有子节点

    我想使用 PHP DOM 从 XML 节点中删除所有子节点 以下之间有什么区别 A while parentNode gt hasChildNodes parentNode gt removeChild parentNode gt chil
  • 如何在 apache 上为锚点 cms 重写指令

    我使用的是一个名为anchor的cms http anchorcms com docs getting started configuration http anchorcms com docs getting started config
  • 自定义 WP 主题时,我应该将导航栏放在“”标签之前还是之后?

    我正在通过制作子主题来自定义 WP 主题 我将 Bootstrap 中的导航栏放入子主题目录中的 header php 文件中 但是 我不确定在哪里放置导航栏代码 我可以把它都放在前面and之后标记成功 例如 无论我选择哪一个 导航栏都显示
  • 如何复制 ArrayIterator 以保留其当前迭代位置?

    因为这似乎是我必须做的才能达到这种效果 arr a gt first b gt second iter new ArrayIterator arr Do a bunch of iterations iter gt next new iter
  • WooCommerce 使用 AJAX 设置购物车数量?

    我已经为此绞尽脑汁好几天了 需要一些指导 我正在为 WooCommerce 网站完全从头开始制作自定义主题 现在我正在尝试让购物车功能正常工作 我一直试图使用按钮 来更新购物车中产品的数量 对我来说问题似乎是WC 我在functions p

随机推荐

  • 数据治理体系完整指南(值得收藏)

    01 数据治理之数据资产管理 数据资产与数据资产管理的定义 随着大数据时代的到来 人们已经认识到数据是一种无形的宝贵资产 谷歌 Facebook 阿里巴巴 腾讯等企业市值高达数千亿美元 不仅在于其独特的商业模式和市场垄断地位 更多的估值是给
  • 虚拟服务器转移到实体服务器,虚拟主机转移到云服务器

    虚拟主机转移到云服务器 内容精选 换一换 场景描述绑定到云服务器上 实现云服务器连接公网的目的 搭配服务弹性云服务器ECS或裸金属服务器 虚拟私有云绑定云服务器实例场景描述NAT网关通过与弹性公网IP绑定 可以使多个云主机 弹性云服务器 裸
  • APP内存泄漏导致崩溃测试实践

    内存泄漏崩溃原因 由于程序运行后没有及时回收无用对象 导致系统没有足够内存分配新对象 会引起APP崩溃 Android的GC机制 Android GC机制沿用了java的GC机制 当需要新内存去分配对象的时候而剩余不够的时候 会触发GC 把
  • for循环中,外循环1000、内循环100和外循环100、内循环1000哪个性能更高?

    1 直接上代码 public class Demo public static void main String args System out println firstTime Demo first 毫秒 255毫秒 System ou
  • laravel+element-ui+vue 搭建详细教程

    1 可用composer安装laravel框架项目 composer create project laravel laravel myblog 安装完成进入项目 cd myblog 2 安装前端资源和编译 npm install npm
  • 服务器监控功能(3种方案)

    服务器监控功能 3种方案 一 Actuator监控 1 添加依赖 2 application yaml配置 3 启动项目 访问 二 SpringBoot Admin 单体 1 Admin Server 端 2 Admin Client 端
  • android studio 安装说明

    转自 http www cnblogs com liuhongfeng archive 2015 12 30 5084896 html 1 下载android studio 含SDK版本 http www android studio or
  • node.js buffer的使用场景和方法及stream的应用

    buffer是什么 Node中 应用需要处理网络协议 操作数据库 处理图片 接收上传文件等 在网络流和文件的操作中 还要处理大量二进制数据 JavaScript自有的字符串远远不能满足这些需求 于是Buffer对象应运而生 Buffer作为
  • Java事务

    事务的ACID 1 原子性 原子性是说将事务看成一个整体 一个不可分割的单位 操作时要么同时成功 要么同时失败 2 一致性 一致性是指事务的前后数据的完整性保持一致 3 隔离性 隔离性是指多个用户并发访问数据库时 数据库给每一个用户开启一个
  • 什么是UTXO?

    经常看到区块链技术中提及UTXO 究竟什么是UTXO呢 个人技术公众号 解决方案工程师 欢迎同领域的朋友关注 相互交流 搜索了半天 讲的都不太好理解 尤其是不明白UTXO比现在的记账方式有哪些优势 集百家之长 成一家之言 我来通俗地讲一讲吧
  • 网络安全(黑客技术)0基础学习手册

    目录梗概 一 自学网络安全学习的误区和陷阱 二 学习网络安全的一些前期准备 三 网络安全学习路线 四 学习资料的推荐 想自学网络安全 黑客技术 首先你得了解什么是网络安全 什么是黑客 网络安全可以基于攻击和防御视角来分类 我们经常听到的 红
  • 用html+js实现一个简单的登录窗口

    文章目录 绘制UI界面 了解text文本框属性 UI界面效果 绘制登录后界面 实现登录验证脚本 运行效果 绘制UI界面 首先我们绘制出基本的不带功能的ui界面 这个界面需要创建一个表单 表单内包含一个username文本框 一个passwo
  • (六十六)支持向量机

    SVM的原理 SVM模型是将实例表示为空间中的点 这样映射就使得单独类别的实例被尽可能宽地明显间隔分开 然后将新的实例映射到同一空间 并基于它们落在间隔的哪一侧来预测所属类别 除了进行线性分类之外 SVM还可以使用所谓的核技巧有效地进行非线
  • java获取resource下的文件路径

    放了文件在 resources 目录下 只想拿到它的路径 详情如下 String path xxx class getClassLoader getResource targetFile txt getPath java获取文件目录 pom
  • 上网被阻断未经pppoe认证_Pppoe协议多运营商接入共用链路的方法

    Pppoe协议多运营商接入共用链路的方法 技术领域 0001 本发明属于计算机技术领域 具体涉及PPPOE协议多运营商接入共用链路方法 技术背景 0002 PPPOE 以太网上的点到点连接协议 认证目前大规模地应用于电信运营商的ADSL接入
  • 不拆无损,在北汽EU5,EU7,EX3,EX7安装app应用

    本文是破解过程 仅供学习参考 如果您只是安装软件 请直接看https blog csdn net robinhunan article details 105963936 这篇文章就可以了 app安装仅需要一个U盘 不需要输入任何命令 即可
  • RV1126 isp开发文档记录

    Rockchip IQ Tools Guide ISP2x v1 3 pdf 主要介绍 RKISP2 x Tuner 以下简称 Tuner 提供了一套便于用户调试 ISP 参数的工具 用户可以在 Tuner 中对所有 ISP 模块开展标定
  • Redis沙盒逃逸漏洞(CVE-2022-0543)复现以及流量特征分析

    Redis简介 Redis Labs Redis是美国Redis Labs公司的一套开源的使用ANSI C编写 支持网络 可基于内存亦可持久化的日志型 键值 Key Value 存储数据库 并提供多种语言的API 漏洞介绍 Redis 存在
  • JdbcTemplate防注入的几种方式

    使用数组 public void deleteItemByName String name Object obj new Object name String sql DELETE FROM t item WHERE name jdbcTe
  • php开启opcache

    1 简介 OPcache 通过将 PHP 脚本预编译的字节码存储到共享内存中来提升 PHP 的性能 存储预编译字节码的好处就是 省去了每次加载和解析 PHP 脚本的开销 注意 如果需要将 Xdebug 扩展和 OPcache 一起使用 必须