Zend 缓存
一、
Zend Optimizer 和 Zend Guard Loader 作用和区别
两者的功能一样。
Zend Optimizer 在PHP5.3以前的版本使用,解密和代码优化,提高PHP应用程序的执行速度,显著降低服务器的CPU负载。
Zend Guard Loader 在php版本大于php5.3之后,解密和代码优化,提高PHP应用程序的执行速度,显著降低服务器的CPU负载。
在PHP版本大于php5.3开始Zend Optimizer 正式被Zend Guard Loader取代了。
二、
使用Zend Opcache 加速PHP
Zend Opcache通过opcode缓存和优化提供更快的PHP执行过程,它将预编译的脚本文件存储在
共享内存中供以后使用,从而避免了从磁盘读取代码并进行编译的时间消耗。
同时,它还应用了一些代码优化模式,使得代码执行速度更快。
1、什么是opcode缓存?
当解释器完成对PHP脚本代码的分析之后,便将它们生成直接运行的中间代码,也被称为操作码
(Operate Code, opcode)。opcode cache的目的是避免重复编译,减少CPU和内存开销。
如果动态内容的性能瓶颈不在于CPU和内存,而在于I/O操作,比如数据库查询带来的磁盘I/O开销,
那么opcode cache 的性能提升是非常有限的。但是既然opcode cache 能带来CPU和内存开销的降低,这总归是好事----
本着环保的态度,也应该尽量减少消耗不是?
现在操作码缓存器(Optimizer+, APC2.0+,其他)使用共享内存进行存储,并且可以直接从
中执行文件,而不用在执行前“反序列化”代码。这将带来显著的性能加速,通过降低了整体服务器
的内存消耗,而且很少有缺点。
2、Optimizer+ 与APC的优缺点对比
Optimizer+与2013年3月中旬改名为opcache。
根据PHP wiki 上的讨论,真的 Opcache 即将整合到php5.5中。作为APC的竞争对手,
新生的Zend Opcache 很有可能取代APC的位置,虽然OptimizerPlus没有像APC那样的user cache功能。
Optimizer+ 相对APC的优点
1、性能。根据测试,Zend Optimizer+始终由于APC。随着代码差异,每秒钟处理的请求数高5%~20%。
Google doc上记录的测试结果,WordPress2.1.1,性能提高约8%。理论上来说,对于WordPress3.5.1,性能应该
也能得到大约5~10%的提升吧。对于运行WordPress的服务器而言,使用Optimizer+可以显著
降低CPU使用率和提高页面加载速度。
2、支持新的PHP版本。Zend和PHP社区都会帮助Optimizer+能够支持最新版本的PHP。
3、可靠性。Optimizer+拥有可选的损坏检测能力,可以防止因数据损坏二导致的服务器奔溃。
4、更好的兼容性。PHP社区打算让Optimizer+与社区支持的所有的PHP版本相兼容。
APC相对Optimizer+的优势
1、APC有数据缓存API,而Optimizer+没有。
2、APC能够回收旧的无效的脚本占用的内存。APC有内存管理器,可以将那些不再使用的
脚本关联的内存进行回收。而Optimizer+不同,它将这样的内存标记为“脏的”,
但并不会回收它们。一旦“脏的”内存占用配置阀值的百分比达到一定值,Optimizer+就将自己重新启动。
这种行为在稳定性上既有优势也有劣势。
3、使用Zend opcode
现在已经可以使用Zend Opcache 替代APC优化加速工具了。目前的Zend opcode
兼容PHP5.2、5.3.、5.4.*和php5.5开发版。不过,将来会取消对PHP5.2的支持。
注意:Zend5Opcache与eacceleralor相冲突。要安装Zend Opcache,可能需要先卸载
eaccelerator------如果你用了这个加速模块的话。
4、体会
PHP上有不少opcode cache组件,如APC、eaccelerator、xcache、Zend Opcache等。
Zend Opcache的性能应该是最好的,。不管用哪个组件,总归是用一个才好。
PHP加速器之Opcache配置详解
一、什么是opcode?
当解释器完成对脚本代码的分析后,便将它们生成可以直接运行的中间代码,也称为操作码(Operate Code,opcode)。
opcode cache的目的是避免重复编译,减少CPU和内存开销。
二、为什么要使用opcode缓存?
这得从PHP代码的生命周期说起,请求PHP脚本时,会经历五个步骤,如下图所示:
Zend引擎必须从文件系统读取文件、扫描其词和表达式、解析文件、创建要执行的计算机代码(称为opcode),
最后执行opcode。每次请求PHP脚本都会执行一遍以上步骤,如果PHP源代码没有变化,那么opcode也不会变化,
显然没有必要每次都重新生成opcode,结合在web中无所不在的缓存机制,我们把opcode缓存下来,
以后直接访问缓存的opcode岂不是更快,启用opcode缓存之后的流程图如下所示:
三、PHP opcode原理
opcode是一种PHP脚本变异后的中间语言,就像Java的bytecode,或者.net的MSI,举例,比如
你写了如下的PHP代码:
<?php
echo "Hello world";
$a = 1 + 1;
echo $a;
?>
PHP执行这段代码会经过如下4个步骤(确切的说,应该是PHP的语言引擎Zend)
1)Scanning(Lexing),将PHP代码转化为语言片段(Tokens)。
2)Parsing,将Tokens转化为简单而有意义的表达式。
3)Compilation,将表达式编译成opcode。
4)Execution,顺序执行opcodes,每次一条,从而实现PHP脚本的功能。
四、PHP Opcache介绍
Optimizer+(Optimizer+于2013年3月中旬改名为Opcache),Opcache 通过将PHP脚本预编译的字节码
存储到共享内存中来提高PHP的性能,存储预编译字节码的好处就是省去了每次加载和解析PHP脚本的开销。
PHP5.5.0及后续版本中已经绑定了Opcache扩展。对于php5.2、PHP5.3、PHP5.4版本可以使用>>PECL扩展中的
Opcache库。
PHP5.5.0及后续版本中已经绑定了Opcache扩展。对于php5
Opcache只能便以为共享扩展。如果你使用--disable-all参数禁用了默认扩展的构建,那么
必须使用--enable-Opcache选项来开启Opcache。编译之后,就可以使用Zend_extension指令来
将Opcache扩展加载到PHP中。
最后说一下使用Opcache加速PHP时应该注意的坑:
Opcache依靠的是PHP文件的modify time作为文件被修改的检测条件,基于这个会引发两个问题。
第一个问题是做版本回滚时,由于版本回滚后的文件修改时间比现有Opcache缓存的文件时间要往前一些,
所以可能会导致Opcache不会清楚缓存,需要手动reload。
第二个问题是做版本发布时,一般都是sync方式,可能会出现文件发布一半时被Opcache缓存,用户访问导致程序报错,这个
主要是因为文件内容缓存了一半,但是文件的时间戳不会改变,所以就算Opcache检测也不会去读取新的文件了,
需要手动reload。
针对这两个问题,不光reload可以解决,同样调用Opcache的接口也可以清楚Opcache缓存。
你可以使用Opcache_reset()或者使用Opcache_invalidate()函数来手动重置Opcache。
Opcache_reset():该函数将重置真个字节码缓存,在调用Opcache_reset()之后,所有的脚本将会重新载入
并且在下次被点击的时候重新解析。
opcache_invalidate():该函数的作用是使得指定脚本的字节码缓存失效。如果force没有设置或者传入
false,那么只有当前脚本的修改时间比对应字节码的时间更新,脚本的缓存才会失效。
但是不推荐使用,个人再生产环境中进行代码发布后调用Opcache_reset()清空缓存
(册数确实可以清空缓存),出现过奇葩问题(访问量打的应用),后来就果断放弃了,使用了reload的方式。
reload方式就是重启php-fpm
service php-fpm reload
Zend 缓存的更多相关文章
- LAMP环境部署总结
linux+apche+mysql+php 此次用到的工具有:/etc/init.d/iptables , selinux, useradd, yum,chkconfig,sshd,visudo,cr ...
- php Zend Opcache,xcache,eAccelerator缓存优化详解(具体根据个人需要选择其一即可,功能都一样切勿重复选择)
载入 XCache 模块 引用 ;; 安装成 zend extension (推荐), 路径一般是 "$extension_dir/xcache.so" zend_extensio ...
- 编译安装 Zend Opcache 缓存Opcache,加速 PHP
Optimizer+ 是 Zend 开发的闭源但可以免费使用的 PHP 优化加速组件,是第一个也是最快的 opcode 缓存工具.现在,Zend 科技公司将 Optimizer+ 在 PHP Lice ...
- php Zend Opcache,xcache,eAccelerator缓存优化详解及对比
XCACHE XCache 是一个开源的 opcode 缓存器/优化器, 这意味着他能够提高您服务器上的 PHP 性能. 他通过把编译 PHP 后的数据缓冲到共享内存从而避免重复的编译过程, 能够直接 ...
- PHP使用Zend Opcache之优化加速和缓存清理总结
简介 字节码缓存不是php的新特性,有很多独立性的扩展可以实现缓存,比如PHP Cache(APC),eAccelerator,ionCube和XCache等等.但是到目前为止,这些独立的扩展并没有集 ...
- PHP 缓存插件之 Zend Opcache ( 取代 APC )
简介: Zend Opcache .APC 这都是 PHP 代码加速器,将 PHP 源代码的编译结果缓存起来,再次调用时对比时间标记,如果没有改变则使用缓存数据,免去再次解析代码的开销. APC 止步 ...
- PHP5.4开启zend opcache缓存
PHP5.5整合了zend opcache,但是5.4以下的需要自己安装. 介绍一下开启opcache方法,环境为wamp(php5.4.16) 下载dll文件 把php_opcache.dll放进p ...
- php在5.5.0默认提供了Zend OPcache
eaccelerator无法兼容php5.5.0,好在php在5.5.0默认提供了Zend OPcache,所以一直习惯eaccelerator的朋友如果要升级到php5.5.0的话,可能要暂时和ea ...
- PHP服务缓存优化之ZendOpcache、xcache、eAccelerator
PHP服务缓存优化原理 Nginx 根据扩展名或者过滤规则将PHP程序请求传递给解析PHP的FCGI,也就是php-fpm进程 缓存操作码(opcode) Opcode,PHP编译后的中间文件,缓存给 ...
随机推荐
- Spring Boot 2.0 整合 FreeMarker 模板引擎
本篇博文将和大家一起使用Spring Boot 2.0 和FreeMarker 模板引擎整合实战. 1. 创建新的项目 2. 填写项目配置信息 3. 勾选web 模块 4. 勾选freemarker模 ...
- MySQL 5.7的安装及主从复制(主从同步)
1.master上开启binlog日志,配置如下 一般mysql配置文件在目录/etc下,叫my.cnf (如果找不到的话也有可能在这些目录下:/etc/my.cnf,/etc/mysql/my.cn ...
- wpf 模板选择器DataTemplateSelector及动态绑定,DataTemplate.Triggers触发器的使用
通常,如果有多个 DataTemplate 可用于同一类型的对象,并且您希望根据每个数据对象的属性提供自己的逻辑来选择要应用的 DataTemplate,则应创建 DataTemplateSelect ...
- python初级 1 数据类型和变量
一.整数(int) 例: 0 1 2 3 -1 -2 –3 In [31]: print(type(0)) <class 'int'> In [32]: print(type(1)) & ...
- CentOS 7.4编译安装Nginx1.10.3+MySQL5.7.16
准备篇 一.防火墙配置 CentOS 7.x默认使用的是firewall作为防火墙,这里改为iptables防火墙. 1.关闭firewall: systemctl stop firewalld.se ...
- Angular4学习笔记(八)- ng-content
内容投影 ng-content ng-content是一个占位符,有些类似于router-outlet. 以前举の例子,父组件包含子组件都是直接指明子组件的selector,比如子组件的selecto ...
- Scala学习笔记(五):内建控制循环
前言 Scala中内建控制循环包括if.while.for.try.match和函数调用. if和while与java类似,不做介绍. for 基础用法 def main(args: Array[St ...
- css文件的MIME错误引发的Jquery Mobile绘制错误
静态文件serve设置的MIME不对,引起的浏览器警告 Resource interpreted as Stylesheet but transferred with MIME type applic ...
- IOC容器特性注入第六篇:利用MVC注入点,把容器启动
这里是利用MVC三个注入点中的:IDependencyResolver 进行注入 在全局类中Global.asax代码如下: #region MVC Inject System.Web.Mvc.Dep ...
- Python 字符串转JSON; 先装字典在转JSON; json.dumps(d)
#-*- coding:UTF-8 -*- import os; import json class MysqlUtil(): def __init__(self): pass if __name__ ...