仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 911|回复: 19
打印 上一主题 下一主题

[学习教程] PHP网页设计了解php道理的opcodes(操作码)

[复制链接]
深爱那片海 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-3 23:41:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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肯定快。
小女巫 该用户已被删除
沙发
发表于 2015-2-4 06:04:15 | 只看该作者
至于模板嘛,各位高人一直以来就是争论不休,我一只小菜鸟就不加入战团啦,咱们新手还是多学点东西的好。
爱飞 该用户已被删除
板凳
发表于 2015-2-9 03:46:16 | 只看该作者
说php的话,首先得提一下数组,开始的时候我是最烦数组的,总是被弄的晕头转向,不过后来呢,我觉得数组里php里最强大的存储方法,所以建议新手们要学好数组。
深爱那片海 该用户已被删除
地板
 楼主| 发表于 2015-2-26 14:34:03 | 只看该作者
环境搭建好,当你看见你的浏览器输出“it works\\\\\\\"时你一定是喜悦的。在你解决问题的时候,我强烈建议多读php手册。
变相怪杰 该用户已被删除
5#
发表于 2015-2-27 06:39:38 | 只看该作者
至于模板嘛,各位高人一直以来就是争论不休,我一只小菜鸟就不加入战团啦,咱们新手还是多学点东西的好。
再见西城 该用户已被删除
6#
发表于 2015-3-1 21:23:47 | 只看该作者
其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎
海妖 该用户已被删除
7#
发表于 2015-3-1 23:46:56 | 只看该作者
装在C盘下面可以利用windows的ghost功能可以还原回来(顺便当做是重转啦),当然啦我的编译目录要放在别的盘下,不然自己的劳动成果就悲剧啦。
不帅 该用户已被删除
8#
发表于 2015-3-7 10:21:37 | 只看该作者
php是动态网站开发的优秀语言,在学习的时候万万不能冒进。在系统的学习前,我认为不应该只是追求实现某种效果,因为即使你复制他人的代码调试成功,实现了你所期望的效果,你也不了解其中的原理。
兰色精灵 该用户已被删除
9#
发表于 2015-3-14 20:18:39 | 只看该作者
写的比较杂,因为我也是个新手,不当至于大家多多指正。
简单生活 该用户已被删除
10#
发表于 2015-3-24 16:49:13 | 只看该作者
写js我最烦的就是 ie 和 firefox下同样的代码 结果显示的结果千差万别,还是就是最好不要用遨游去调试,因为有时候遨游是禁用js的,有可能代码是争取结果被遨游折腾的认为是代码写错。
只想知道 该用户已被删除
11#
发表于 2015-3-26 18:45:41 | 只看该作者
曾经犯过一个很低级的错误,我在文件命名的时候用了一个横线\\\\\\\'-\\\\\\\' 号,结果找了好几个小时的错误,事实是命名的时候 是不能用横线 \\\\\\\'-\\\\\\\' 的,应该用的是下划线  \\\\\\\'_\\\\\\\' ;
因胸联盟 该用户已被删除
12#
发表于 2015-3-27 21:11:10 | 只看该作者
在学习的过程中不能怕麻烦,不能有懒惰的思想。学习php首先应该搭建一个lamp环境或者是wamp环境。这是学习php开发的根本。虽然网络上有很多集成的环境,安装很方便,使用起来也很稳定、
蒙在股里 该用户已被删除
13#
发表于 2015-4-1 15:29:22 | 只看该作者
先学习php和mysql,还有css(html语言很简单)我认为现在的效果比以前的方法好。
金色的骷髅 该用户已被删除
14#
发表于 2015-4-2 14:42:18 | 只看该作者
基础有没有对学习php没有太大区别,关键是兴趣。
小魔女 该用户已被删除
15#
发表于 2015-4-17 15:54:51 | 只看该作者
找到的的资料很多都是在论坛里的,需要注册,所以我一般没到一个论坛都注册一个id,所有的id都注册成一样的,这样下次再进来的时候就不用重复注册啦。当然有些论坛的某些资料是需要的付费的。
莫相离 该用户已被删除
16#
发表于 2015-4-19 10:25:57 | 只看该作者
说点我烦的低级错误吧,曾经有次插入mysql的时间 弄了300年结果老报错,其实mysql的时间是有限制的,大概是到203X年  具体的记不清啦,囧。
若天明 该用户已被删除
17#
发表于 2015-4-24 00:42:44 | 只看该作者
找到的的资料很多都是在论坛里的,需要注册,所以我一般没到一个论坛都注册一个id,所有的id都注册成一样的,这样下次再进来的时候就不用重复注册啦。当然有些论坛的某些资料是需要的付费的。
活着的死人 该用户已被删除
18#
发表于 2015-4-26 07:10:42 | 只看该作者
这些都是最基本最常用功能,我们这些菜鸟在系统学习后,可以先对这些功能深入研究。
山那边是海 该用户已被删除
19#
发表于 2015-6-12 20:57:37 | 只看该作者
刚开始安装php的时候,我图了个省事,把php的扩展全都打开啦(就是把php.ini 那一片 extension 前面的冒号全去掉啦),这样自然有好处,以后不用再需要什么功能再来打开。
若相依 该用户已被删除
20#
发表于 2015-6-15 13:53:15 | 只看该作者
学好程序语言,多些才是王道,写两个小时代码的作用绝对超过看一天书,这个我是深有体会(顺便还能练打字速度)。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 23:28

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表