PHP7如何开启Opcode打造强悍性能详解


Posted in PHP onMay 11, 2018

前言

鸟哥在博客中说,提高PHP 7性能的几个tips,第一条就是开启opcache:

记得启用Zend Opcache, 因为PHP7即使不启用Opcache速度也比PHP-5.6启用了Opcache快, 所以之前测试时期就发生了有人一直没有启用Opcache的事情

那么什么是Opcache呢?

Opcache 的前生是 Optimizer+ ,它是PHP的官方公司 Zend 开发的一款闭源但可以免费使用的 PHP 优化加速组件。 Optimizer+ 将PHP代码预编译生成的脚本文件 Opcode 缓存在共享内存中供以后反复使用,从而避免了从磁盘读取代码再次编译的时间消耗。同时,它还应用了一些代码优化模式,使得代码执行更快。从而加速PHP的执行。

 PHP的正常执行流程如下

PHP7如何开启Opcode打造强悍性能详解

 request请求(nginx,apache,cli等)-->Zend引擎读取.php文件-->扫描其词典和表达式 -->解析文件-->创建要执行的计算机代码(称为Opcode)-->最后执行Opcode--> response 返回

每一次请求PHP脚本都会执行一遍以上步骤,如果PHP源代码没有变化,那么Opcode也不会变化,显然没有必要每次都重新生成Opcode,结合在Web中无所不在的缓存机制,我们可以把Opcode缓存下来,以后直接访问缓存的Opcode岂不是更快,启用Opcode缓存之后的流程图如下所示:

PHP7如何开启Opcode打造强悍性能详解 

 Opcode cache 的目地是避免重复编译,减少 CPU 和内存开销。

下面介绍Opcache的安装

安装:

1、找到opcache的扩展,我的是php7.1

yum list php71*

2、安装扩展

yum install php71w-opcache.x86_64

配置:

zend_extension=opcache.so
[opcache]
;开启opcache
opcache.enable=1 

;CLI环境下,PHP启用OPcache
opcache.enable_cli=1

;OPcache共享内存存储大小,单位MB
opcache.memory_consumption=128 

;PHP使用了一种叫做字符串驻留(string interning)的技术来改善性能。例如,如果你在代码中使用了1000次字符串“foobar”,在PHP内部只会在第一使用这个字符串的时候分配一个不可变的内存区域来存储这个字符串,其他的999次使用都会直接指向这个内存区域。这个选项则会把这个特性提升一个层次——默认情况下这个不可变的内存区域只会存在于单个php-fpm的进程中,如果设置了这个选项,那么它将会在所有的php-fpm进程中共享。在比较大的应用中,这可以非常有效地节约内存,提高应用的性能。
这个选项的值是以兆字节(megabytes)作为单位,如果把它设置为16,则表示16MB,默认是4MB
opcache.interned_strings_buffer=8

;这个选项用于控制内存中最多可以缓存多少个PHP文件。这个选项必须得设置得足够大,大于你的项目中的所有PHP文件的总和。
设置值取值范围最小值是 200,最大值在 PHP 5.5.6 之前是 100000,PHP 5.5.6 及之后是 1000000。也就是说在200到1000000之间。
opcache.max_accelerated_files=4000

;设置缓存的过期时间(单位是秒),为0的话每次都要检查
opcache.revalidate_freq=60

;从字面上理解就是“允许更快速关闭”。它的作用是在单个请求结束时提供一种更快速的机制来调用代码中的析构器,从而加快PHP的响应速度和PHP进程资源的回收速度,这样应用程序可以更快速地响应下一个请求。把它设置为1就可以使用这个机制了。
opcache.fast_shutdown=1

;如果启用(设置为1),OPcache会在opcache.revalidate_freq设置的秒数去检测文件的时间戳(timestamp)检查脚本是否更新。
如果这个选项被禁用(设置为0),opcache.revalidate_freq会被忽略,PHP文件永远不会被检查。这意味着如果你修改了你的代码,然后你把它更新到服务器上,再在浏览器上请求更新的代码对应的功能,你会看不到更新的效果
强烈建议你在生产环境中设置为0,更新代码后,再平滑重启PHP和web服务器。
opcache.validate_timestamps=0

;开启Opcache File Cache(实验性), 通过开启这个, 我们可以让Opcache把opcode缓存缓存到外部文件中, 对于一些脚本, 会有很明显的性能提升.
这样PHP就会在/tmp目录下Cache一些Opcode的二进制导出文件, 可以跨PHP生命周期存在.
opcache.file_cache=/tmp

查看phpinfo:

PHP7如何开启Opcode打造强悍性能详解

测试结果:

PHP7如何开启Opcode打造强悍性能详解

同样的接口从以前的几百毫秒提升到现在的50ms左右

PHP7如何开启Opcode打造强悍性能详解

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
中篇:安装及配置PHP
Dec 13 PHP
谈谈新手如何学习PHP
Dec 23 PHP
Php注入点构造代码
Jun 14 PHP
PHP 出现乱码和Sessions验证问题的解决方法!
Dec 06 PHP
php 空格,换行,跳格使用说明
Dec 18 PHP
二招解决php乱码问题
Mar 25 PHP
discuz加密解密函数使用方法和中文注释
Jan 21 PHP
CI框架学习笔记(二) -入口文件index.php
Oct 27 PHP
PHP概率计算函数汇总
Sep 13 PHP
PHP在线调试执行的实现方法(附demo源码)
Apr 28 PHP
php类自动装载、链式操作、魔术方法实现代码
Jul 23 PHP
thinkPHP5框架导出Excel文件简单操作示例
Aug 03 PHP
laravel项目利用twemproxy部署redis集群的完整步骤
May 11 #PHP
PHP实现搜索时记住状态的方法示例
May 11 #PHP
PHP实现压缩图片尺寸并转为jpg格式的方法示例
May 10 #PHP
PHP使用PDO抽象层获取查询结果的方法示例
May 10 #PHP
PHP分页显示的方法分析【附PHP通用分页类】
May 10 #PHP
ThinkPHP防止重复提交表单的方法实例分析
May 10 #PHP
PHP实现用户登录的案例代码
May 10 #PHP
You might like
php+ajax实现文章自动保存的方法
2014/12/30 PHP
PHP函数实现从一个文本字符串中提取关键字的方法
2015/07/01 PHP
PHP 读取文本文件内容并分页显示
2016/01/02 PHP
抛弃 PHP 代价太高
2016/04/26 PHP
php微信公众号js-sdk开发应用
2016/11/28 PHP
php+javascript实现的动态显示服务器运行程序进度条功能示例
2017/08/07 PHP
javascript基础知识大全 便于大家学习,也便于我自己查看
2012/08/17 Javascript
javascript校验价格合法性实例(必须输入2位小数)
2014/05/05 Javascript
BootStrap响应式导航条实例介绍
2016/05/06 Javascript
详解VUE的状态控制与延时加载刷新
2017/03/27 Javascript
jQuery实现腾讯信用界面(自制刻度尺)样式
2017/08/15 jQuery
vuex学习之Actions的用法详解
2017/08/29 Javascript
微信小程序实现搜索指定景点周边美食、酒店
2019/05/18 Javascript
layui下拉列表select实现可输入查找的方法
2019/09/28 Javascript
Js图片点击切换轮播实现代码
2020/07/27 Javascript
antd的select下拉框因为数据量太大造成卡顿的解决方式
2020/10/31 Javascript
springboot+vue实现文件上传下载
2020/11/17 Vue.js
[01:08:24]DOTA2-DPC中国联赛 正赛 RNG vs Phoenix BO3 第一场 2月5日
2021/03/11 DOTA
python3利用Dlib19.7实现人脸68个特征点标定
2018/02/26 Python
详解python如何在django中为用户模型添加自定义权限
2018/10/15 Python
解决nohup执行python程序log文件写入不及时的问题
2019/01/14 Python
Python实现钉钉发送报警消息的方法
2019/02/20 Python
Tensorflow中的降维函数tf.reduce_*使用总结
2020/04/20 Python
PyInstaller的安装和使用的详细步骤
2020/06/02 Python
openCV提取图像中的矩形区域
2020/07/21 Python
关于Python3的import问题(pycharm可以运行命令行import错误)
2020/11/18 Python
解决python3中os.popen()出错的问题
2020/11/19 Python
Python安装Bs4的多种方法
2020/11/28 Python
浅析HTML5中的download属性使用
2019/03/13 HTML / CSS
海淘零差价,宝贝全球购: 宝贝格子
2016/08/24 全球购物
英国优质鞋类专家:Robinson’s Shoes
2017/12/08 全球购物
《最佳路径》教学反思
2014/04/13 职场文书
2015年卫生局工作总结
2015/07/24 职场文书
pytorch常用数据类型所占字节数对照表一览
2021/05/17 Python
探究Mysql模糊查询是否区分大小写
2021/06/11 MySQL
Spring mvc是如何实现与数据库的前后端的连接操作的?
2021/06/30 Java/Android