文档章节

PHP的执行过程

四明狂客
 四明狂客
发布于 2016/07/09 17:52
字数 763
阅读 41
收藏 0

1)传递给php程序需要的执行文件hello.php,php程序完成基本的准备工作后启动PHP及Zend引擎,加载注册的扩展模块。

 2) 初始化完后读取脚本文件,Zend引擎对脚本进行此词法分析,语法分析,然后有Zend引擎编译成opcode码,最后Zend虚拟机执行opcode码。

PHP本身是用c实现的,因此最终调用的也都是c的函数,实际上,我们可以把php看做是一个c开发的软件。

详细的过程:

a.Scaning(Lexing):将PHP代码转换成语言片(Tokens).

b.Parsing:将Tokens转换成简单而有意义的表达式.

c.Compilation:将表达式编译成Opcode.

d.Execution:顺次执行Opcodes,从而实现PHP脚本的功能.

3)词法分析和语法分析

        解释器的组成: a.读取源程序并处理语言结构。b.处理语言结构并生成目标程序.

        上面提到的Lex:是词法分析器,也就是判断变量单词是否写错了,标签是否写错等等。

         Yacc 是语法分析生成器: 语法分析也就是函数的结构,调用的方式 都是否正确等等。

4)opcode:简单来说 ,opcode是ZEND虚拟机中的指令,也就是php执行的最基本的单位.

5)PHP的结构体系:

    a.zend引擎:

    Zend整体用纯c实现,是php的内核部分,它将php代码翻译(词法、语法解析    等一系列编译过程)为可执行opcode的处理并实现相应的处理方法、实现了基本的数据结构(如hashtable、oo)、内存分配及管理、提供了相应的api方法供外部调用,是一切的核心,所有的外围功能均围绕zend实现。

b.Extensions扩展:

    绕着zend引擎,extensions通过组件式的方式提供各种基础服务,我们常见的各种内置函数(如array系列)、标准库等都是通过extension来实现,用户也可以根据需要实现自己的extension以达到功能扩展、性能优化等目的(如贴吧正在使用的php中间层、富文本解析就是extension的典型应用)。

c.Sapi  :

        Sapi全称是Server Application Programming Interface,也就是服务端应用编程接口,sapi通过一系列钩子函数,使得php可以和外围交互数据,这是php非常优雅和成功的一个设计,通过sapi成功的将php本身和上层应用解耦隔离,php可以不再考虑如何针对不同应用进行兼容,而应用本身也可以针对自己的特点实现不同的处理方式。

d.上层应用:

     这就是我们平时编写的php程序,通过不同的sapi方式得到各种各样的应用模式,如通过webserver实现web应用、在命令行下以脚本方式运行等等.

© 著作权归作者所有

共有 人打赏支持
四明狂客
粉丝 10
博文 83
码字总数 72315
作品 0
南昌
程序员
PHP调用Oracle存储过程

存储过程是实际位于 Oracle 中的程序。大多数存储过程都是用 PL/SQL 编写的,在 Oracle 数据库 10g 第 2 版和更高版本中,您可以用 Java、.NET 或其他语言将它们编写为外部过程。 存储过程通...

workingTiams
2012/11/30
0
0
PHP内核探索:Zend虚拟机

通过前面的学习,我们了解到一个PHP文件在服务器端的执行过程包括以下两个大的过程: 递给php程序需要执行的文件, php程序完成基本的准备工作后启动PHP及Zend引擎, 加载注册的扩展模块。 ...

旋转木马-千里马
2016/01/21
53
0
PHP内核探索:一次请求的开始与结束

开始阶段有两个过程: 第一个过程是模块初始化阶段(MINIT), 在整个SAPI生命周期内(例如Apache启动以后的整个生命周期内或者命令行程序整个执行过程中), 该过程只进行一次。 第二个过程...

贪睡猫仙mosen
2014/02/18
0
0
PHP内核探索:一次请求生命周期

深入探讨 真正的内部运行过程没有这么简单。以上过程只是个简略版,让我们再深入挖掘一下,看看幕后还发生了些什么。 Apache启动后,PHP解释程序也随之启动。PHP的启动过程有两步: 第一步是...

贪睡猫仙mosen
2014/02/18
0
0
Mysql用存储过程和事件每月定时创建一张数据库表

业务需求,把app用户开机写入一张日志表appopenlog。 上线7个月来,有74万条记录了。 现考虑要分库分表了。每个月初创建一张以appopenlog为前缀,日期年月为后缀的数据库表,比如:appopenlo...

phpervip
07/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Shell编程(expect同步文件、指定host和同步文件、构建文件分发系统、批量执行命令)

expect脚本同步文件 需求:自动同步文件 实验准备: A机器:192.168.248.130 B机器:192.168.248.129 实现: 1.A机器编写4.expect脚本文件,内容如下所示: #!/usr/bin/expectset passwd "...

蛋黄_Yolks
21分钟前
1
0
ppwjs之bootstrap颜色:背景颜色

<!DOCTYPT html><html><head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><title>ppwjs欢迎您</title><link rel="icon" href="/favicon.ico" ......

ppwjs
22分钟前
0
0
Ubuntu与 Fedora之对比

大家好。今天我将重点介绍两个流行的Linux发行版之间的一些特性和差异; Ubuntu 18.04和Fedora 28。它们都有自己的包管理; Ubuntu使用DEB,而Fedora使用RPM,但它们都具有相同的桌面环境(GNO...

linuxprobe16
26分钟前
1
0
线性代数入门

线性代数的概念对于理解机器学习背后的原理非常重要,尤其是在深度学习领域中。它可以帮助我们更好地理解算法内部到底是怎么运行的,借此,我们就能够更好的做出决策。所以,如果你真的希望了...

牛奋Debug
昨天
3
0
开发5分钟,调试2小时 - 该如何debug?

几年来我在答疑群、论坛、公众号、知乎回答的各种问题,没有一万也有八千。其中有三分之二以上都是在帮人看报错,帮人 debug(调试代码)。 可以说,会不会 debug,有没有 debug 的意识,懂不...

crossin
昨天
4
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部