PHP代码运行流程

发布时间:2024-02-04 17:11:10

PHP最初于1994年开始设计。1995年发布第一版,定名为PHPTools,提供了留言本、计数器等简单功能。下面是小编分享的PHP代码运行流程,欢迎大家参考!

PHP代码运行流程

Opcode是一种php脚本编译后的中间语言,就像Java的ByteCode,或者的MSL,举个例子,比如你写下了如下的PHP代码:

PHP执行这段代码会经过如下4个步骤(确切的来说,应该是PHP的语言引擎Zend)

1.Scanning(Lexing),将PHP代码转换为语言片段(Tokens)2.Parsing,将Tokens转换成简单而有意义的表达式3pilation,将表达式编译成Opocdes4.Execution,顺次执行Opcodes,每次一条,从而实现PHP脚本的功能。

题外话:现在有的Cache比如APC,可以使得PHP缓存住Opcodes,这样,每次有请求来临的时候,就不需要重复执行前面3步,从而能大幅的提高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]=>"HelloWorld")[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:TokenID(也就是在Zend内部的改Token的对应码,比如,T_ECHO,T_STRING),和源码中的原来的内容。

接下来,就是Parsing阶段了,Parsing首先会丢弃TokensArray中的多于的空格,然后将剩余的Tokens转换成一个一个的简单的表达式

1.echoaconstantstring2.addtwonumberstogether3.storetheresultofthepriorexpressiontoavariable4.echoavariable

然后就改Compilation阶段了,它会把Tokens编译成一个个op_array,每个op_arrayd包含如下5个部分:

1.Opcode数字的标识,指明了每个op_array的*作类型,比如add,echo2.结果存放Opcode结果3.*作数1给Opcode的*作数4.*作数25.扩展值1个整形用来区别被重载的*作符

比如,我们的PHP代码会被Parsing成:

*ZEND_ECHO'HelloWorld'*ZEND_ADD~011*ZEND_ASSIGN!0~0*ZEND_ECHO!0

呵呵,你可能会问了,我们的$a去那里了?

恩,这个要介绍*作数了,每个*作数都是由以下俩个部分组成:

a)op_type:为IS_CONST,IS_TMP_VAR,IS_VAR,IS_UNUSED,orIS_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了。

[PHP代码运行流程]相关文章:

第2篇:java从代码到运行的过程

Java技术具有卓越的通用*、高效*、平台移植*和安全*,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者*社群。以下是小编为大家搜索整理的java从代码到运行的过程,希望能给大家带来帮助!更多精彩内容请及时关注我们应届毕业生考试网!

用一个图来描述这个过程会比较容易理解:

1:编写代码

首先把我们想要计算机做的事情,通过Java表达出来,写成Java文件,这个过程就是编写代码的过程。如上图所示的Hello.java文件。

2:编译

写完Java代码后,机器并不认识我们写的Java代码,需要进行编译成为字节码,编译后的文件叫做class文件。如上图所示的Hello.class文件。

3:类装载ClassLoader

类装载的功能是为执行程序寻找和装载所需要的类。

ClassLoader能够加强代码的安全*,主要方式是:把本机上的类和网络资源类相分离,在调入类的时候进行检查,因而可以限制任何“特洛伊木马”的应用。

4:字节码(byte-code)校验

功能是对class文件的代码进行校验,保证代码的安全*。

Java软件代码在实际运行之前要经过几次测试。JVM将代码输入一个字节码校验器以测试代码段格式并进行规则检查--检查伪造指针、违反对象访问权限或试图改变对象类型的非法代码。

注意----所有源于网络的类文件都要经过字节码校验器字节码校验器对程序代码进行四遍校验,这可以保证代码符合JVM规范并且不破坏系统的完整*。如果校验器在完成四遍校验后未返回出错信息,则下列各点可被保证:

-类符合JVM规范的类文件格式

-无访问限制异常

-代码未引起*作数栈上溢或下溢

-所有*作代码的参数类型将总是正确的

-无非法数据转换发生,如将整数转换为对象引用

-对象域访问是合法的

5:解释(Interpreter)

可是机器也不能认识class文件,还需要被解释器进行解释,机器才能最终理解我们所要表达的东西。

6:运行

最后由运行环境中的Runtime对代码进行运行,真正实现我们想要机器完成的工作。

7:说明

由上面的讲述,大家看到,Java通过一个编译阶段和一个运行阶段,来让机器最终理解我们想要它完成的工作,并按照我们的要求进行运行。

在这两个阶段中,需要我们去完成的就是编译阶段的工作,也就是说:我们需要把我们想要机器完成的工作用Java语言表达出来,写成Java源文件,然后把源文件进行编译,形成class文件,最后就可以在Java运行环境中运行了。运行阶段的工作由Java平台自身提供,我们不需要做什么工作。

第3篇:PHP代码如何规范

对于PHP入门学习的童鞋来说,基础是很重的,一定要打好基础。那么大家知道PHP代码如何规范呢?下面一起来看看!

了解PHP开发规范可以少走很多弯路,网上各种PHP开发规范也很多,我结合自身使用PHP的情况,来说说我所理解的PHP开发规范,涉及多个方面,比如PHP代码规范、PHP文件命名规范、网站开发流程、网站安全与维护等。

作为PHP开发规范的开篇,我从一个纯PHP开发者的角度来说说我所认为的PHP代码规范,主要从PHP目录框架结构、PHP代码书写规范、PHP文件命名规范三个角度来阐述,希望对PHP入门学习者有所帮助。

合理建设PHP目录框架结构

我们知道在使用PHP进行网站开发之前,我们需要建设网站的目录结构,网站目录框架结构设计得合理规范,不但有利于网站开发,而且对SEO,网站推广都有好处。

一般最基础的PHP网站结构涉及图片、CSS文件、JS文件、第三方组件、管理后台等内容,相对应的,基础的PHP目录框架结构也涉及这些内容,这些目录命名时也有规范,比如

图片目录:images或者pic

CSS目录:css

JS目录:js

第三方组件目录:libs或者include,下一级目录可以根据具体的组件名定义目录名

管理目录:一般都是admin,单位了安全起见,你可以另起一个目录名或者对admin目录设置密码保护。如何对访问目录设置密码保护?

特别提醒:对于网站的框架目录结构,事先要做好规划,为了对搜索引擎友好便于网站推广,建议目录结构层次不要太深,二三级目录结构就可以了。

另外如果你采用模板,可以创建模板目录,比如将目录命名为tpl,如果使用第三方模板引擎,比如smarty,你可以根据需要自行决定是否要另设目录。

对于中等规模的网站,你也可以根据网站功能划分网站目录框架结构,比如按照频道等。

PHP文件命名规范

良好的PHP文件命名规范也是PHP开发规范的要素,有助于记忆,便于管理,PHP网站程序文件的命名也有一定的规则,比如

PHP网站首页文件命名规范:index.php或index

CSS文件命名规范:主CSS文件命名为style.css,另外你也可以针对具体的模块或者频道命名,比如用于用户的CSS文件,可以定义为user_style.css或者u_style.css

JS文件命名规范:主JS文件命名为main.js或major.js,其他的JS文件命名,你可以根据具体的页面或者特定的对象命名,比如首页JS文件可以命名为index.js,服务于用户登录的JS文件可以命名为user_login.js等。

网站配置文件命名规范:config.php或default_config.php等

文件命名特别提醒:在对PHP文件进行命名时考虑到可移植*,一律请使用小写命名,另外与网站目录名命名一样,文件命名时可以采用两种方式,一种可以使用拼音命名具体的文件,一种可以使用简单明了的英语单词命名文件,切勿随便命名,导致今后维护混乱。

PHP代码书写规范

良好的PHP代码规范,有助于PHP入门学习者从你写的PHP代码中受益,也有助于你今后的代码维护。

1、对于所写的PHP代码,添加必要的代码注释,同时代码注释要规范,更多基础PHP代码书写规范,请参考PHP基本语法教程

2、保持良好的PHP代码书写规范,合理使用缩进,保持代码美观。

3、使用赋值符时变量名、赋值符、值之间以空格分隔,即

4、在书写if、switch、函数代码时,务必保持大括号匹配,即

或者

5、命名变量名或者函数名时注意代码书写规范,可以使用拼音、英语单词、缩写等形式,推荐以英语单词作为PHP代码命名规范,对于两个单词以上的以下划线连接或者其中一个单词首字母大写的形式,即

以上就是基础的PHP代码规范,对于PHP初学者学习PHP会有所帮助。养成良好的PHP代码规范会让开发者受益一生。

至此,PHP开发规范手册之PHP代码规范就介绍完了,良好的网站框架目录构建能力、PHP文件命名规范和PHP代码书写规范需要自己在不断的开发中积累和养成,同时这些开发规范也有助于伙伴之间的合作,有助于PHP入门学习者学习你的PHP代码。

第4篇:PHP代码优化技巧

PHP是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,入门门槛较低,易于学习,使用广泛,主要适用于Web开发领域。PHP的文件后缀名为php。下面小编为大家介绍PHP代码优化技巧,欢迎阅读参考!

1.echo比print快。

2.使用echo的多重参数代替字符串连接。

3.在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用foreach代替。

4.对global变量,应该用完就unset()掉。

5.用单引号代替双引号来包含字符串,这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会。

6.函数代替正则表达式完成相同功能。

7.当执行变量$i的递增或递减时,$i++会比++$i慢一些。这种差异是PHP特有的,并不适用于其他语言,++$i更快是因为它只需要3条指令(opcodes),$i++则需要4条指令。后置递增实际上会产生一个临时变量,这个临时变量随后被递增。而前置递增直接在原值上递增。

8.使用选择分支语句(switchcase)好于使用多个if,elseif语句。

9.利用var_dump进行PHP代码调试。如果你在寻找php调试技术,我必须说var_dump应该是你要找的目标,在显示php信息方面这个命令可以满足你的所有需要,而调试代码的多数情况与得到PHP中的数值有关。

10.在包含文件时使用完整路径,解析*作系统路径所需的时间会更少。

11.动辄创建全局数值是一种糟糕的做法,不过有时候实际情况的确又需要这么做。对于数据库表或数据库连接信息使用全局数值是一个不错的想法,但不要在你的PHP代码中频繁使用全局数值。另外,更好的一种做法是把你的全局变量存放在一个config.php文件中。

12.如果你想知道脚本开始执行的时刻,使用$_SERVER[‘REQUEST_TIME']要好于time()。

13.打开apache的mod_deflate模块。

14.用@屏蔽错误消息的做法非常低效。

15.尽量采用大量的PHP内置函数。

16.递增一个未预定义的局部变量要比递增一个预定义的局部变量慢9至10倍。

17.派生类中的方法运行起来要快于在基类中定义的同样的方法。

18.仅定义一个局部变量而没在函数中调用它,同样会减慢速度(其程度相当于递增一个局部变量)

19.Apache解析一个PHP脚本的时间要比解析一个静态HTML页面慢2至10倍。尽量多用静态HTML页面,少用脚本。

20.正如之前提到的,任何php网站中最重要的部分有99%的可能是数据库。因此,你需要非常熟悉如何正确的使用sql,学会关联表和更多高级的数据库技术。

21.调用带有一个参数的空函数,其花费的时间相当于执行7至8次的局部变量递增*作。

22.当*作字符串并需要检验其长度是否满足某种要求时,你想当然地会使用strlen()函数。此函数执行起来相当快,因为它不做任何计算,只返回zval结构(C的内置数据结构,用于存储PHP变量)中存储的已知字符串长度。

23.并不是所有情况都必须使用面向对象开发,面向对象往往开销很大,每个方法和对象调用都会消耗很多内存。

24.除非脚本可以缓存,否则每次调用时都会重新编译一次。引入一套PHP缓存机制通常可以提升25%至100%的*能,以免除编译开销。

第5篇:php验证码代码怎么写

我们先来处理php程序文件的开始符和结束符,这个不太复杂,我们用两个变量来表示它们:

复制代码代码如下:

<?php

//文件头...

header("Content-type:image/png");

//创建真彩*白纸

$im=@imagecreatetruecolor(50,20)ordie("建立图像失败");

//获取背景颜*

$background_color=imagecolorallocate($im,255,255,255);

//填充背景颜*(这个东西类似油桶)

imagefill($im,0,0,$background_color);

//获取边框颜*

$border_color=imagecolorallocate($im,200,200,200);

//画矩形,边框颜*200,200,200

imagerectangle($im,0,0,49,19,$border_color);

//逐行炫耀背景,全屏用1或0

for($i=2;$i<18;$i++){

//获取随机淡*

$line_color=imagecolorallocate($im,rand(200,255),rand(200,255),rand(200,255));

//画线

imageline($im,2,$i,47,$i,$line_color);

}

//设置字体大小

$font_size=12;

//设置印上去的文字

$Str[0]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";

$Str[1]="abcdefghijklmnopqrstuvwxyz";

$Str[2]="01234567891234567890123456";

//获取第1个随机文字

$imstr[0]["s"]=$Str[rand(0,2)][rand(0,25)];

$imstr[0]["x"]=rand(2,5);

$imstr[0]["y"]=rand(1,4);

//获取第2个随机文字

$imstr[1]["s"]=$Str[rand(0,2)][rand(0,25)];

$imstr[1]["x"]=$imstr[0]["x"]+$font_size-1+rand(0,1);

$imstr[1]["y"]=rand(1,3);

//获取第3个随机文字

$imstr[2]["s"]=$Str[rand(0,2)][rand(0,25)];

$imstr[2]["x"]=$imstr[1]["x"]+$font_size-1+rand(0,1);

$imstr[2]["y"]=rand(1,4);

//获取第4个随机文字

$imstr[3]["s"]=$Str[rand(0,2)][rand(0,25)];

$imstr[3]["x"]=$imstr[2]["x"]+$font_size-1+rand(0,1);

$imstr[3]["y"]=rand(1,3);

//写入随机字串

for($i=0;$i<4;$i++){

//获取随机较深颜*

$text_color=imagecolorallocate($im,rand(50,180),rand(50,180),rand(50,180));

//画文字

imagechar($im,$font_size,$imstr[$i]["x"],$imstr[$i]["y"],$imstr[$i]["s"],$text_color);

}

//显示图片

imagepng($im);

//销毁图片

imagedestroy($im);

?></p

第6篇:PHP调用的C代码

用php调用C函数,常通过调用系统命令函数的方式来实现,其中主要有system()和exec()两种,还有一种是passthru(),以下是小编为大家搜索整理的PHP调用的C代码,希望能给大家带来帮助!更多精彩内容请持续关注我们应届毕业生考试网!

system()方法输出并返回最后一行的shell结果。

exec()不输出结果,返回最后一行shell结果,所有结果可以保存到一个返回的数组里面。

相同点是都可以获取命令执行的状态码。

PHP调用C函数方法为:

如果C函数为一个简单的helloworld,文件名称为hello.c。

#include

main()

{

printf("helloworld!");

}

注意:如果多行输出要用"

"不要"\n"

首先gcc编译成gcchello.c-ohello

然后再php函数中写一个函数:

$r=exec("./hello");

echo$r;

?>

如果是exec,如果在浏览器中执行结果的话,会出现1个helloworld(echo$r产生),如果用system来调用的话,则会出现两个helloworld!(./hello和echo$r产生)。

当然还可以通过php扩展的方式来实现php调用c函数!