|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
在相册系统的开发上,因为采用的是团队分工合作方式,更让我明白了在一个团队之中,团队成员之间的交流沟通的重要性,如果没有很好的沟通交流,成员之间的任务没有分配好。 Opcondes是一种php剧本编译后的两头言语,就像Java的Byte Code,或.NET 的MSL 。(都没懂得过~)
举个文中的例子
复制代码 代码以下:
<?php
echo "Hello World";
$a = 1 + 1;
echo $a;
?>
PHP履行这段代码会经由以下4个步调(切实的来讲,应当是PHP的言语引擎Zend)
复制代码 代码以下:
1.Scanning(Lexing) (扫描),将PHP代码转换为言语片断(Tokens)
2.Parsing(语法剖析), 将Tokens转换成复杂而成心义的表达式
3.Compilation(编译), 将表达式编译成Opocdes
4.Execution(履行编译后的了局), 依次履行Opcodes,每次一条,从而完成PHP剧本的功效。
个中他还提到一句:“如今有的Cache好比APC,可使得PHP缓存住Opcodes,如许,每次有恳求光降的时分,就不需求反复履行后面3步,从而能大幅的进步PHP的履行速度。 ” 这多是php履行速度对照快的缘由之一吧~
那甚么是Lexing? 学过编译道理的同窗都应当对编译道理中的词法剖析步调有所懂得,Lex就是一个词法剖析的根据表。 Zend/zend_language_scanner.c会依据Zend/zend_language_scanner.l(Lex文件),来输出的 PHP代码停止词法剖析,从而失掉一个一个的“词”,PHP4.2入手下手供应了一个函数叫token_get_all,这个函数就能够讲一段PHP代码 Scanning成Tokens;
假如用这个函数处置咱们开首提到的PHP代码,将会失掉以下了局:
复制代码 代码以下:
Array
(
[0] => Array
(
[0] => 367
[1] => Array
(
[0] => 316
[1] => echo
)
[2] => Array
(
[0] => 370
[1] =>
)
[3] => Array
(
[0] => 315
[1] => "Hello World"
)
[4] => ;
[5] => Array
(
[0] => 370
[1] =>
)
[6] => =
[7] => Array
(
[0] => 370
[1] =>
)
[8] => Array
(
[0] => 305
[1] => 1
)
[9] => Array
(
[0] => 370
[1] =>
)
[10] => +
[11] => Array
(
[0] => 370
[1] =>
)
[12] => Array
(
[0] => 305
[1] => 1
)
[13] => ;
[14] => Array
(
[0] => 370
[1] =>
)
[15] => Array
(
[0] => 316
[1] => echo
)
[16] => Array
(
[0] => 370
[1] =>
)
[17] => ;
)
剖析这个前往了局咱们可以发明,源码中的字符串,字符,空格,城市原样前往。每一个源代码中的字符,城市呈现在响应的按次处。而,其他的好比标签,操作符, 语句,城市被转换成一个包括俩局部的Array: Token ID (也就是在Zend外部的改Token的对应码,好比,T_ECHO,T_STRING),和源码中的本来的内容。
接上去,就是Parsing阶段了,Parsing起首会抛弃Tokens Array中的多于的空格,然后将残剩的Tokens转换成一个一个的复杂的表达式
复制代码 代码以下:
1.echo a constant string
2.add two numbers together
3.store the result of the prior expression to a variable
4.echo a variable
然后就改Compilation阶段了,它会把Tokens编译成一个个op_array, 每一个op_arrayd包括以下5个局部:
复制代码 代码以下:
1.Opcode数字的标识,指了然每一个op_array的操作类型,好比add , echo
2.了局 寄存Opcode了局
3.操作数1 给Opcode的操作数
4.操作数2
5.扩大值 1个整形用来区分被重载的操作符
好比,咱们的PHP代码会被Parsing成:
复制代码 代码以下:
* ZEND_ECHO 'Hello World'
* ZEND_ADD ~0 1 1
* ZEND_ASSIGN !0 ~0
* ZEND_ECHO !0
呵呵,你能够会问了,咱们的$a去那边了?
恩,这个要引见操作数了,每一个操作数都是由以下俩个局部构成:
a)op_type : 为IS_CONST, IS_TMP_VAR, IS_VAR, IS_UNUSED, or IS_CVb)u,一个结合体,依据op_type的分歧,分离用分歧的类型保留了这个操作数的值(const)或左值(var)而关于var来讲,每一个var也纷歧样
IS_TMP_VAR, 望文生义,这个是一个一时变量,保留一些op_array的了局,以便接上去的op_array利用,这类的操作数的u保留着一个指向变量表的一个句柄(整数),这类操作数普通用~开首,好比~0,暗示变量表的0号未知的一时变量
IS_VAR 这类就是咱们普通意义上的变量了,他们以$开首暗示
IS_CV 暗示ZE2.1/PHP5.1今后的编译器利用的一种cache机制,这类变量保留着被它援用的变量的地址,当一个变量第一次被援用的时分,就会被CV起来,今后对这个变量的援用就不需求再次去查找active符号表了,CV变量以!开首暗示。
这么看来,咱们的$a被优化成!0了。
总结:
1.php的履行按次是: -> php法式
-> 被Scanning(扫描转换为Tokens(言语片断))
-> 被Parsing(语法剖析,将Tokens转换成复杂而成心义的表达式)
-> Compilation(编译,将表达式编译成Opocdes(操作码))
-> Execution(按次履行编译后的了局)
2. APC(Alternative PHP Cache)的缓存机制可以缓存住Opcodes,如许,下次有恳求光降的时分,就不需求反复履行后面3步,从而能大幅的进步PHP的履行速度。 这多是php履行速度对照快的缘由之一
增补:
apc,zend optimize是之所以可以减速php
就是由于他可以缓存opcode
并非zend引擎自己自带的功效
zend引擎默许是一个轮回中任何一项都要走的学会了PHP,那么学其他的语言,肯定速成,反过来也一样,如果你之前学过其他的语言,那么学PHP肯定快。 |
|