php的opcode缓存_PHP_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > PHP > php的opcode缓存

php的opcode缓存

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

前言:由php的运行机制决定,其实php在运行阶段我们也是可以进行缓存的从而提高程序运行效率,这就是我们常说的opcode缓存。
1、简述php的运行机制
(因为本文是写opcode缓存的所以这里只是简要概述,后边会专门写一篇揭秘php运行机制的。)
a).php文件通过浏览器过来
b)请求交给SAPI,随后SAPI层将控制权转给PHP
c)zend_language_scanner对代码进行扫描,对php代码进行词法分析转换成一系列的tokens array
d)zend_language_parser将c步骤产生的一系列tokens处理掉空格等无用的代码以后转换成一系列表达式
e)经过compiler阶段生成opcode返回zend_op_array指针
f)zend_vm_execute根据传入的zend_op_array指针,执行opcode并将结果返回输出
(下图来自互联网,但是描述的很不错借花献佛了)
class="alignnone size-full wp-image-300" alt="" height="363" src="/Upload/Images/2014091309/D37210E0212769D5.jpg">
2、opcode简介
Opcode是operation code(操作码)的简称,其实就是第一小节c)、d)、e)步骤产生的一种中间码,
opcode是一个四元组,(opcode, op1, op2, result),它们分别代表操作码,第一操作数,第二操作数,结果。
如:

1 2 3 <?php functions">echo "taobao search blog"; ?>

对应的tokens

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 Array ( ????[0] => Array ????????( ????????????[0] => 367 ????????????[1] => <?php ????????????[2] => 1 ????????) ? ????[1] => Array ????????( ????????????[0] => 316 ????????????[1] => echo ????????????[2] => 1 ????????) ? ????[2] => Array ????????( ????????????[0] => 370 ????????????[1] => ????????????[2] => 1 ????????) ? ????[3] => Array ????????( ????????????[0] => 315 ????????????[1] => "taobao search blog" ????????????[2] => 1 ????????) ? ????[4] => ; ????[5] => Array ????????( ????????????[0] => 370 ????????????[1] => ????????????[2] => 1 ????????) ? ????[6] => Array ????????( ????????????[0] => 369 ????????????[1] => ?> ????????????[2] => 1 ????????) ? )

对应的opcode就是

1 2 3 4 5 line???? # *? op?????????????????????????? fetch????????? ext? return? operands --------------------------------------------------------------------------------- ???2???? 0? >?? ECHO???????????????????????????????????????????????????? 'taobao+search+blog' ???4???? 1??? > RETURN?????????????????????????????????????????????????? 1 ?????????2*?? > ZEND_HANDLE_EXCEPTION

3、使用apc对opcode缓存
a)假设php路径为/home/ad/php
对opcode进行缓存的软件很多(apc、eAcclerator、Xcache、Zend Platform),这里主要介绍apc
APC提供两种缓存功能,即缓存Opcode(目标文件),我们称之为apc_compiler_cache。同时它还提供一些接口用于PHP开发人员将 用户数据驻留在内存中,我们称之为apc_user_cache。我们这里主要讨论apc_compiler_cache的配置。
下载地址:http://pecl.php.net/package/APC
最新版本为APC-3.1.6.tgz

1 2 3 4 5 6 7 wget http://pecl.php.net/get/APC-3.1.6.tgz tar -zxvf APC-3.1.6.tgz cd APC-3.1.6 /home/ad/php/bin/phpize ./configure --enable-apc --enable-apc-mmap? --with-php-config=/home/ad/php/bin/php-config make make install

编辑php.ini
添加apc的配置

1 2 3 4 5 6 7 8 9 10 11 12 13 [apc] extension=apc.so apc.enabled=1 apc.shm_segments = 1 apc.shm_size = 128 apc.ttl = 0 apc.user_ttl = 7200 apc.num_files_hint = 1000 apc.write_lock=1 apc.stat = 0 apc.max_file_size=1M apc.filters = a.php,b.php apc.cache_by_default=1

重新apache就ok啦

4、常用参数的解析
apc.enabled 开启apc 设置为0关闭,1为开启
apc.shm_segments 共享内存块数
apc.shm_size 共享内存大小,但是是M
那么显然共享内存的总数就是apc.shm_segments*apc.shm_size
apc.num_files_hint 允许多少个opcode被缓存
apc.stat 为1的时候会自动检查opcode对应的php文件是否有更新,有更新的话会自动更新。设置为0的话就不会去检查了这样会提高apc的效率,但是要使 php的修改生效的话就必须重启apache了,或者使用函数apc_cache_clear()来清空缓存
apc.ttl opcode缓存的过期时间,设置为0表示不过期,如果不为0会检查两次请求之间的时间,如果时间大于设置值那么会更新opcode缓存
apc.write_lock 表示多个进程同时更新一份opcode缓存的时候那么只让最先的一个生效,可以有效避免写冲突
apc.max_file_size 超过设置值大小的文件不被缓存
apc.filters 需要特例的文件,多个文件用逗号(,)相隔
apc.filters 与 apc.cache_by_default结合使用,
当apc.cache_by_default为1时apc.filters文件不被缓存,当apc.cache_by_default为0时仅apc.filters文件被缓存

?

转载自: http://www.searchtb.com/2010/12/php-opcode-cache.html

上一篇: java构造器内部的多态方法 下一篇: 没有下一篇了!
发表评论
用户名: 匿名