php opcode缓存

1.什么是opcode

解释器分析代码之后,生成可以直接运行的中间代码,就称做操作码,opcode

2.解释器与编译器的区别

解释器是生成了中间代码后直接运行中间代码,运行时的控制权还是在解释器手里。

编译器则是生成了中间代码之后还进一步优化代码,生成可以直接运行的目标程序 ,但不执行,等待用户触发执行,他的控制权在目标程序,和编译器无关。

3.php是解释型语言,他的原理与编译有点相似,包括词法分析,语法分析,语义分析.....,php解释器的核心引擎就是zend engine

4.php如何查看一段代码的opcode

安装php的parsekit扩展,通过扩展的api就可以查看php的opcode,如parsekit_compile_string()

php -r "var_dump(parsekit_compile_string(‘print 1+1;‘));"

5.opcode有生成

首先要经过词法分析,脚本代码可以看做是一系列单词组合,解释器要对这些单词进行分类,并打上记号

比如print,我们查看php源码包中的zend/zend_language_scanner.l在这个文件中我们就可以查找到pirnt对应的标记。T_PRINT

找到标记之后接下来就是语法分析,在zend/zend_language_parser.y中,我们可以找到T_PRINT对应的函数

接着在zend/zend_compile.c中找到这个函数实现代码,这个函数就是实现 了opcode的转换。所有的opcode都是用户整数来表示 的。

6、 开启opcode缓存

生成opcode是需要系统开销的,每一次执行都要生成一次opcode,这样的开销还是可观的,所以php的优化必须开启opcode的缓存,来避免重复的编译。

php的opcode缓存有APC,eAccelerator,XCache,这些都是把opcode放在共享内存中。

以APC为例:在php.ini中设置 apc.cache_by_default = on

通过<?php print_r(apc_cache_info());?>可以查看缓存的情况,

7.opcode缓存过期

opcode缓存是会过期的,如果过期就要得新生成一次,当然也可以跳过过期检查的机制,在php.ini中设置apc.stat=off

这样程序代码的修改得通过重启服务器来生效。

8.脚本的跟踪与分析,可以使用xdebug来跟踪,用xdebug可以实现性能跟踪器,找到程序的执行瓶颈,从而优化程序。

xdebug.profiler_output_dir = /tmp/xdebug

xdebug.profiler_output_name = cachegrind.out.%p

xdebug的函数跟踪:

xdebug.trace_output_dir = /tmp/xdebug

xdebug.trace_output_name = trace.%c

window下可以用wincachegrind查看xdebug的报告文件。

时间: 2024-12-21 12:10:48

php opcode缓存的相关文章

PHP OPCode缓存:Window下安装APC

前言 PHP语言在性能上相对于其他编译型语言来说性能算不上突出,但是使用了OPCode缓存后性能提升还是很明显的.常见的主要有 Eaccelerator,XCache,APC本文主要介绍APC的使用. APC的介绍 APC,全称是Alternative PHP Cache,官方翻译叫"可选PHP缓存".它为我们提供了缓存和优化PHP的中间代码的框架. APC的缓存分两部分:系统缓存和用户数据缓存. 系统缓存 它是指APC把PHP文件源码的编译结果缓存起来,然后在每次调用时先对比时间标记

深入了解php opcode缓存原理

什么是opcode opcode(operate code)是计算机指令中的一部分,用于指定要执行的操作,指令的格式和规范由处理器的指定规范指定 opcode是一种php脚本编译后的中间语言,就像java的ByteCode,或者.NET的MSL 为什么要使用opcode缓存 opcode cache的目的是避免重复编译,减少CPU和内存开销的.如果动态内容的性能瓶颈不在于CPU和内容,而在于IO操作,比如数据库查询带来的IO开销,这个时候opcode cache的性能提升是非常有局限的.无论如何

深入理解PHP Opcode缓存原理

什么是opcode缓存? 当解释器完成对脚本代码的分析后,便将它们生成可以直接运行的中间代码,也称为操作码(Operate Code,opcode).Opcode cache的目地是避免重复编译,减少CPU和内存开销.如果动态内容的性能瓶颈不在于CPU和内存,而在于I/O操作,比如数据库查询带来的磁盘I/O开销,那么opcode cache的性能提升是非常有限的.但是既然opcode cache能带来CPU和内存开销的降低,这总归是好事. 现代操作码缓存器(Optimizer+,APC2.0+,

php的opcode缓存

前言:由php的运行机制决定,其实php在运行阶段我们也是可以进行缓存的从而提高程序运行效率,这就是我们常说的opcode缓存.1.简述php的运行机制(因为本文是写opcode缓存的所以这里只是简要概述,后边会专门写一篇揭秘php运行机制的.)a).php文件通过浏览器过来b)请求交给SAPI,随后SAPI层将控制权转给PHPc)zend_language_scanner对代码进行扫描,对php代码进行词法分析转换成一系列的tokens arrayd)zend_language_parser将

深入理解PHP Opcode缓存原理(转)

什么是opcode缓存?当解释器完成对脚本代码的分析后,便将它们生成可以直接运行的中间代码,也称为操作码(Operate Code,opcode).Opcode cache的目地是避免重复编译,减少CPU和内存开销.如果动态内容的性能瓶颈不在于CPU和内存,而在于I/O操作,比如数据库查询带来的磁盘I/O开销,那么opcode cache的性能提升是非常有限的.但是既然opcode cache能带来CPU和内存开销的降低,这总归是好事. 现代操作码缓存器(Optimizer+,APC2.0+,其

【转载】深入理解PHP Opcode缓存原理

转载地址:深入理解PHP Opcode缓存原理 什么是opcode缓存? 当解释器完成对脚本代码的分析后,便将它们生成可以直接运行的中间代码,也称为操作码(Operate Code,opcode).Opcode cache的目地是避免重复编译,减少CPU和内存开销.如果动态内容的性能瓶颈不在于CPU和内存,而在于I/O操作,比如数据库查询带来的磁盘I/O开销,那么opcode cache的性能提升是非常有限的.但是既然opcode cache能带来CPU和内存开销的降低,这总归是好事. 现代操作

PHP Opcode缓存原理

什么是opcode缓存? 当解释器完成对脚本代码的分析后,便将它们生成可以直接运行的中间代码,也称为操作码(Operate Code,opcode).Opcode cache的目地是避免重复编译,减少CPU和内存开销.如果动态内容的性能瓶颈不在于CPU和内存,而在于I/O操作,比如数据库查询带来的磁盘I/O开销,那么opcode cache的性能提升是非常有限的.但是既然opcode cache能带来CPU和内存开销的降低,这总归是好事. 现代操作码缓存器(Optimizer+,APC2.0+,

PHP-深入理解Opcode缓存

1.什么是opcode缓存? 当解释器完成对脚本代码的分析后,便将它们生成可以直接运行的中间代码,也称为操作码(Operate Code,opcode).Opcode cache的目地是避免重复编译,减少CPU和内存开销.如果动态内容的性能瓶颈不在于CPU和内存,而在于I/O操作,比如数据库查询带来的磁盘I/O开销,那么opcode cache的性能提升是非常有限的.但是既然opcode cache能带来CPU和内存开销的降低,这总归是好事. 现代操作码缓存器(Optimizer+,APC2.0

Apc缓存Opcode(转)

1.PHP执行 PHP的运行阶段也分成三个阶段: Parse.语法分析阶段. Compile.编译产出opcode中间码. Execute.运行,动态运行进行输出. 由于PHP是个解释型语言执行的时候先得把程序读进来,然后由Zend引擎编译成opcode.最后Zend虚拟机顺次执行这些opcode(指令)完成操作.因此我们可 以把这个Opcode缓存起来,下次就能避免重新编译了. APC缓存作用如下: 2 .APC简介 Alternative PHP Cache (APC) 是一个开放自由的PH