一、
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 缓存的更多相关文章

  1. LAMP环境部署总结

    linux+apche+mysql+php 此次用到的工具有:/etc/init.d/iptables , selinux, useradd, yum,chkconfig,sshd,visudo,cr ...

  2. php Zend Opcache,xcache,eAccelerator缓存优化详解(具体根据个人需要选择其一即可,功能都一样切勿重复选择)

    载入 XCache 模块 引用 ;; 安装成 zend extension (推荐), 路径一般是 "$extension_dir/xcache.so" zend_extensio ...

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

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

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

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

  5. PHP使用Zend Opcache之优化加速和缓存清理总结

    简介 字节码缓存不是php的新特性,有很多独立性的扩展可以实现缓存,比如PHP Cache(APC),eAccelerator,ionCube和XCache等等.但是到目前为止,这些独立的扩展并没有集 ...

  6. PHP 缓存插件之 Zend Opcache ( 取代 APC )

    简介: Zend Opcache .APC 这都是 PHP 代码加速器,将 PHP 源代码的编译结果缓存起来,再次调用时对比时间标记,如果没有改变则使用缓存数据,免去再次解析代码的开销. APC 止步 ...

  7. PHP5.4开启zend opcache缓存

    PHP5.5整合了zend opcache,但是5.4以下的需要自己安装. 介绍一下开启opcache方法,环境为wamp(php5.4.16) 下载dll文件 把php_opcache.dll放进p ...

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

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

  9. PHP服务缓存优化之ZendOpcache、xcache、eAccelerator

    PHP服务缓存优化原理 Nginx 根据扩展名或者过滤规则将PHP程序请求传递给解析PHP的FCGI,也就是php-fpm进程 缓存操作码(opcode) Opcode,PHP编译后的中间文件,缓存给 ...

随机推荐

  1. springboot 项目中获取默认注入的序列化对象 ObjectMapper

    在 springboot 项目中使用 @SpringBootApplication 会自动标记 @EnableAutoConfiguration 在接口中经常需要使用时间类型,Date ,如果想要格式 ...

  2. Java日志框架(Commons-logging,SLF4j,Log4j,Logback)

    简介 在系统开发中,日志是很重要的一个环节,日志写得好对于我们开发调试,线上问题追踪等都有很大的帮助.但记日志并不是简单的输出信息,需要考虑很多问题,比如日志输出的速度,日志输出对于系统内存,CPU的 ...

  3. TypeScript学习笔记(八):1.5版本之后的模块和命名空间

    我之前有写过TS1.5版本之前的“模块”的笔记:TypeScript学习笔记(七):模块 但是TS这里的模块和在ECMAScript 2015里的模块(即JS原生支持了模块的概念)概率出现了混淆,所以 ...

  4. rocketmq 源码

    https://github.com/YunaiV/incubator-rocketmq

  5. SASS常用语法

    原文地址:这里 @charset "UTF-8"; /** * 自定义变量 */ $blue: #1875e7; div { color: $blue; } /** * 变量要嵌在 ...

  6. Java知多少(42)泛型通配符和类型参数的范围

    本节先讲解如何限制类型参数的范围,再讲解通配符(?). 类型参数的范围 在泛型中,如果不对类型参数加以限制,它就可以接受任意的数据类型,只要它是被定义过的.但是,很多时候我们只需要一部分数据类型就够了 ...

  7. Java知多少(65)线程的挂起、恢复和终止

    有时,线程的挂起是很有用的.例如,一个独立的线程可以用来显示当日的时间.如果用户不希望用时钟,线程被挂起.在任何情形下,挂起线程是很简单的,一旦挂起,重新启动线程也是一件简单的事. 挂起,终止和恢复线 ...

  8. Go指南练习_图像

    https://tour.go-zh.org/methods/25 一.题目描述 还记得之前编写的图片生成器吗?我们再来编写另外一个,不过这次它将会返回一个 image.Image 的实现而非一个数据 ...

  9. 近5年常考Java面试题及答案整理(三)

    上一篇:近5年常考Java面试题及答案整理(二) 68.Java中如何实现序列化,有什么意义? 答:序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化.可以对流化后的对象进行读写 ...

  10. 求教如何在win7 X64系统上安装.net 3.5 sp1

    其实win7系统已自带net 3.5.1了.开始菜单——控制面板——程序——打开或关闭windows功能,找到Microsoft .NET Framework 3.5.1,去掉选项,确定.然后再进入“ ...