现代 PHP 新特性 —— Zend Opcache (转)
转自:https://laravelacademy.org/post/4396.html
1、概述
字节码缓存不是PHP的新特性,有很多独立的扩展可以实现,比如APC、eAccelerator和Xache等,但是截至目前这些扩展都没有集成到PHP内核,从PHP 5.5.0开始,PHP内置了字节码缓存功能,名为Zend Opcache。
开始之前,我们先来看看什么是字节码缓存,以及字节码缓存的作用是什么。
众所周知,PHP是解释型语言,构建在Zend 虚拟机之上,PHP解释器在执行PHP脚本时会解析PHP脚本代码,把PHP代码编译成一系列Zend操作码(opcode:http://php.net/manual/zh/internals2.opcodes.php,由于每个操作码都是一个字节长,所以又叫字节码,字节码可以直接被Zend虚拟机执行),然后执行字节码。每次请求PHP文件都是这样,这会消耗很多资源,如果每次HTTP请求都必须不断解析、编译和执行PHP脚本,消耗的资源更多。如果PHP源码不变,相应的字节码也不会变化,显然没有必要每次都重新生成Opcode,结合在Web应用中无处不在的缓存机制,我们可以把首次生成的Opcode缓存起来,这样下次直接从缓存取,岂不是很快?下面是启用Opcode缓存之前和之后的流程图:
字节码缓存能存储预先编译好的PHP字节码,这样,下次请求PHP脚本时,PHP解释器不用每次读取、解析和编译PHP代码,直接从内存中读取预先编译好的字节码,然后立即执行,这样能省很多时间,极大提升应用的性能。
2、启用Zend Opcache
注:如果使用Windows开发环境,或者使用
brew
或apt-get
等命令安装的PHP可以略过编译步骤。
默认情况下,Zend Opcache没有开启,需要我们在编译时使用--enable-opcache
指定启用Zend Opcache。
编译好PHP后还需要在php.ini
中指定Opcache扩展路径:
zend_extension=/path/to/opcache.so
一般而言PHP编译成功后会显示Zend Opcache扩展路径,但如果想不起来,可以使用如下命令找到PHP扩展所在目录:
php-config --extension-dir
注:如果你使用Xdebug,需要在
php.ini
中先加载Zend Opcache,再加载Xdebug。
更新php.ini
后重启PHP进程并查看是否启用成功:
3、配置Zend Opcache
启用Zend Opcache后还需要在php.ini
中配置Zend Opcache,下面是一份配置示例作为参考:
opcache.validate_timestamps=1 //生产环境中配置为0
opcache.revalidate_freq=0 //检查脚本时间戳是否有更新时间
opcache.memory_consumption=64 //Opcache的共享内存大小,以M为单位
opcache.interned_strings_buffer=16 //用来存储临时字符串的内存大小,以M为单位
opcache.max_accelerated_files=4000 //Opcache哈希表可以存储的脚本文件数量上限
opcache.fast_shutdown=1 //使用快速停止续发事件
注:后续我们还会进一步介绍Zend Opcache的配置,PHP官网中列出了Zend Opcache的全部设置:http://ua2.php.net/manual/zh/opcache.configuration.php。
4、使用Zend Opcache
Zend Opcache使用起来很简单,因为启用之后它会自动运行,Zend Opcache会自动在内存中缓存预先编译好的PHP字节码,如果缓存了某个文件的字节码,就执行对应的字节码。
如果php.ini
中配置了opcache.validate_timestamps
值为0,需要小心,因为Zend Opcache将不能觉察PHP脚本的变化,必须手动清空Zend OPcache缓存的字节码,才能让它发现PHP文件的变动。这个配置适合在生产环境中设置为0,但在开发环境会带来不便,我们可以在开发环境中这样配置启用自动验证缓存功能:
opcache.validate_timestamps=1
opcache.revalidate_freq=0
现代 PHP 新特性 —— Zend Opcache (转)的更多相关文章
- PHP5.3, PHP5.4, PHP5.5新特性
PHP 5.3中的新特性 1. 支持命名空间 (Namespace) 2. 支持延迟静态绑定(Late Static Binding) 3. 支持goto语句 4. 支持闭包.Lambda/Anony ...
- php新特性--持续更新
命名空间 在其他语言中不算新鲜事,但php是5.3.0中引入,具体定义就不复述了,其主要作用是 封装和组织相关php类 .命名空间被引入之前php主要是通过Zend方式组织代码,这种方式带来的问题是类 ...
- php5.3 PHP5.4 PHP5.5 新特性/使用PHP5.5要注意的
1.PHP 5.3中的新特性 1.1 PHP 5.3中的新特性 1.1.1. 支持命名空间 (Namespace) 毫无疑问,命名空间是PHP5.3所带来的最重要的新特性. 在PHP5.3中,则只 ...
- PHP使用Zend Opcache之优化加速和缓存清理总结
简介 字节码缓存不是php的新特性,有很多独立性的扩展可以实现缓存,比如PHP Cache(APC),eAccelerator,ionCube和XCache等等.但是到目前为止,这些独立的扩展并没有集 ...
- PHP7新特性 What will be in PHP 7/PHPNG
本文结合php官网和鸟哥相关文章总结: 官网:http://www.php7.ca/ https://wiki.php.net/phpng PHP7将在2015年10月正式发布,PHP7 ,将会是 ...
- zend opcache的最佳设置
2016-01-21 在网上无意中看到的一篇文章,这哥们非常简洁地谈论了zend opcache的最佳设置,他说他为此花了大量的时间探索zend opcache的每个设置选项的细节,甚至是阅读它的源代 ...
- linux下PHP5.5的安装【oci8,pdo-oci,memcache,Zend OPCache扩展】
最近一段时间学习了一下PHP,用CI做了一个小项目,为了开发方便,本地windows下使用了集成环境XAMPP,不过当把项目部署到linux上时,确实遇到了很多问题,下面把我在linux上安装php的 ...
- PHP5.5的新特性
看了@轩脉刃 今天出炉的PHP 5.5 新特性.不过没有翻译全,我这里稍微补充下,整理成完整的一篇:) 原文:http://www.php.net/manual/zh/migration55.new- ...
- PHP 7.4.0发布!一起看看有哪些新特性
PHP 7.4.0 发布了,此版本标志着 PHP 7 系列的第四次特性更新. 看了英文手册后,发现其进行了许多改进,并带来了一些新特性,现在将这些新特性您: 1.Typed Properties 类型 ...
随机推荐
- 缺陷的背后---LIMIT M,N 分页查找
一.问题发现篇 最近组内做了一次典型缺陷分享时,翻阅2018年的缺陷,找到了一个让我觉得“有料”的bug(别的同事测试发现的),先大致简单的描述下这个问题: 需要实现的功能:从一个DB库同步某一段时间 ...
- oracle数据库开启与关闭
先用CRT软件链接-——建立会话——telent/ssh——写服务器Ip——点击链接——输入密码 # su - oracle 打开数据库 # cmd 进入特权模式 $ sqlplus / a ...
- Flask实战-留言板-安装虚拟环境、使用包组织代码
Flask实战 留言板 创建项目目录messageboard,从GreyLi的代码中把Pipfile和Pipfile.lock文件拷贝过来,这两个文件中定义了虚拟环境中需要安装的包的信息和位置,进入m ...
- Win10环境下 HTTP 错误 500.19 - Internal Server Error 问题及其解决方法
记一下今日份小bug... 明天要做软件架构实验了,今天打算测试下运行web项目,于是乎,找出了以前用JSP写的web项目测试运行不了,我再打开浏览器测试Tomcat服务器,在地址栏键入http:// ...
- java 接口详解
定义接口 接口继承和实现继承的规则不同,一个类只有一个直接父类,但可以实现多个接口.Java 接口本身没有任何实现,只描述 public 行为,因此 Java 接口比 Java 抽象类更抽象化.Jav ...
- java项目word文件转html文件
最近在项目开发中用户提出要在电脑上没有装office时在浏览器中打开word文件,最后确定的逻辑:用户选择想要查看的文件,页面js判断文件是否为word.不是执行下载,是后端根据word文件后缀访问对 ...
- WEUI滚动加载
var row = 6, page = 1; var loading = false; //状态标记 $(document.body).infinite().on("infinite&quo ...
- ACTIVEMQ 实例化到MSSQL
实例化文章很多,不重复,自行查询 直接上XML <!-- Licensed to the Apache Software Foundation (ASF) under one or more c ...
- RSA非对称加密,公钥加密/私钥解密
非对称加密 package test; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFound ...
- EECS 649 Introduction to Artificial Intelligence
EECS 649 Introduction to Artificial IntelligenceExamElectronic Blackboard Submission Due: April 24, ...