博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
php opcode缓存
阅读量:4326 次
发布时间:2019-06-06

本文共 1346 字,大约阅读时间需要 4 分钟。

本文移至:

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的报告文件。

 

 

  

 

转载于:https://www.cnblogs.com/myblog1314/p/4439584.html

你可能感兴趣的文章
输入1-53周,输出1-53周的开始时间和结束时间
查看>>
实验二
查看>>
shell——按指定列排序
查看>>
crash 收集
查看>>
507 LOJ 「LibreOJ NOI Round #1」接竹竿
查看>>
UI基础--烟花动画
查看>>
2018. 2.4 Java中集合嵌套集合的练习
查看>>
精通ASP.NET Web程序测试
查看>>
vue 根据不同属性 设置背景
查看>>
51Nod1601 完全图的最小生成树计数 Trie Prufer编码
查看>>
Codeforces 1110D. Jongmah 动态规划
查看>>
android驱动在win10系统上安装的心酸历程
查看>>
优雅的程序员
查看>>
oracle之三 自动任务调度
查看>>
Android dex分包方案
查看>>
ThreadLocal为什么要用WeakReference
查看>>
删除本地文件
查看>>
FOC实现概述
查看>>
base64编码的图片字节流存入html页面中的显示
查看>>
这个大学时代的博客不在维护了,请移步到我的新博客
查看>>