PHP内核的实现和世界上绝大数的程序一样,接收输入数据,做相应处理后输出结果。用PHP编写的代码就是输入数据,PHP内核对编写的代码进行解释和运算,最后返回运算结果。当编写的PHP代码给内核去执行的时候,PHP内核会对PHP代码进行词法分析、语法分析。词法分析把PHP代码分割成一个个的单元(token),语法分析则将这些单元转换为Zend Engine

可执行的操作。然后PHP内部的Zend Engine对这些操作进行顺序执行。Zend Engine时PHP内核的核心部分,负责最终操作的执行和结果的返回

SAPI接口

SAPI(Server Application Programming Interface) 是PHP具体应用的编程接口。脚本执行的开始都是以SAPI接口实现开始的。只是不同的SAPI接口实现会完成他们特定的工作

web服务器会将请求转发给SAPI,SAPI转发给zendEngine。

PHP常用的SAPI接口有CGI,CLI,FastCGI,Apache2Handler(mod_php模式运行)

无论使用何种SAPI接口都会经过两个主要的阶段,处理请求之前的开始阶段和请求之后的结束阶段,开始阶段有两个过程,第一个过程是模块初始化阶段(MINIT)在整个SAPI生命周期内该过程只进行一次,第二个过程是模块激活阶段(RINIT)该过程发生在请求阶段。请求处理后就进入了结束阶段,一般脚本执行到末尾或者通过调用exit()或die()函数,PHP都将进入结束阶段。结束阶段也分为两个环节,一个请求结束后停用模块,一个SAPI生命周期结束时关闭模块。

单进程SAPI生命周期

CLI/CGI模式的PHP属于单进程的SAPI模式。这类的请求在处理一次请求后就关闭。也就是只会经过如下几个环节: 开始 - 请求开始 - 请求关闭 - 结束 SAPI接口实现就完成了其生命周期。如图2.1所示:

图2.1 单进程SAPI生命周期

多进程SAPI生命周期

通常PHP是编译为apache的一个模块来处理PHP请求。Apache一般会采用多进程模式, Apache启动后会fork出多个子进程,每个进程的内存空间独立,每个子进程都会经过开始和结束环节, 不过每个进程的开始阶段只在进程fork出来以来后进行,在整个进程的生命周期内可能会处理多个请求。 只有在Apache关闭或者进程被结束之后才会进行关闭阶段,在这两个阶段之间会随着每个请求重复请求开始-请求关闭的环节。 如图2.2所示:

图2.2 多进程SAPI生命周期

多线程的SAPI生命周期(xampp apache2handler sapi 采用该模式)

多线程模式和多进程中的某个进程类似,不同的是在整个进程的生命周期内会并行的重复着 请求开始-请求关闭的环节

图2.3 多线程SAPI生命周期

APACHE2HANDLER

php 代码的执行的更多相关文章

  1. Java中普通代码块,构造代码块,静态代码块执行顺序

    //执行顺序:(优先级从高到低.)静态代码块>mian方法>构造代码块>构造方法. 其中静态代码块只执行一次.构造代码块在每次创建对象是都会执行. 1 普通代码块 1 //普通代码块 ...

  2. python3下载远程代码并执行

    第一步: 先在gist之类的网站上贴上代码,目的不是高亮,而可以raw的形式获取代码,这样可以省掉处理html的时间,我这里用的是pasteraw: 远程上的代码:http://cdn.pastera ...

  3. request重定向或者是response转发请求后面的代码依然执行

    调用response.redirect(),或者request.getRequestDispatcher(loginAddr).forward(request,response);后,后面的代码照样执 ...

  4. js eval()函数 接收一个字符串,做为js代码来执行。 如: s='var d="kaka"'; 或者s=‘function (code){return code }’;

    eval函数接收一个参数s,如果s不是字符串,则直接返回s.否则执行s语句.如果s语句执行结果是一个值,则返回此值,否则返回undefined. 需要特别注意的是对象声明语法“{}”并不能返回一个值, ...

  5. try{...} catch {...} finally{...} 各种情况代码的执行情况

    try { int i = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("in the 'try'"); } ca ...

  6. openresty源码剖析——lua代码的执行

    上一篇文章中我们讨论了openresty是如何加载lua代码的 那么加载完成之后的lua代码又是如何执行的呢 ##代码的执行  在init_by_lua等阶段  openresty是在主协程中通过lu ...

  7. JavaSe:代码块执行顺序

    //执行顺序:(优先级从高到低.)静态代码块>mian方法>构造代码块>构造方法. 其中静态代码块只执行一次.构造代码块在每次创建对象是都会执行. //普通代码块:在方法或语句中出现 ...

  8. javascript系列1--把字符串当代码来执行

    转发请标明来源:http://www.cnblogs.com/johnhou/p/javascript.html  请尊重笔者的劳动成果  --John Hou 在javascript中有多种方法可以 ...

  9. Java静态代码块、构造代码块执行顺序问题

    package com.zxl.staticdemo; public class BlockTest { static { System.out.println("BlockTest静态代码 ...

  10. 怎样解决if __name__ == "__main__":下面的代码没有执行的问题

    很多初学者可能在用pycharm运行代码时会出现if __name__ == "__main__":下面的代码没有执行的问题,出现这类问题的原因是unittest运行姿势造成的,如 ...

随机推荐

  1. k8s debug记录之kubelet user.slice container monitor failure

    在kubernetes中,如果使用其自带的单机启动脚本./hack/local-up-cluster.sh来启动一个本地集群的话,会在kubelet的日志中观察到类似以下内容的日志: Failed t ...

  2. Spring AOP实现拦截转发控制

    import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import ...

  3. Django的信号机制详解

    Django提供一种信号机制.其实就是观察者模式,又叫发布-订阅(Publish/Subscribe) .当发生一些动作的时候,发出信号,然后监听了这个信号的函数就会执行. Django内置了一些信号 ...

  4. Oracle数据类型,函数与存储过程

    字符串类型    固定长度:char nchar    n 表示Unicode编码    可变长度: varchar2 nvarchar2 数字类型:number(P,S)P:整数位数,S小数位数   ...

  5. javaEE开发之文件下载

    package com.example.web; import java.io.File; import java.io.FileInputStream; import java.io.IOExcep ...

  6. javascript获取日期的年,月,日

    var date = new Date(strTime); return date.getFullYear()+"-"+(date.getMonth()+1)+"-&qu ...

  7. loadrunner脚本中写入脚本输出log到外部文件,分析参数取值方式

    loadrunner脚本中写入脚本输出log到外部文件,分析参数取值方式 分类: 心得 loadrunner 我的测试 2012-04-01 12:52 2340人阅读 评论(0) 收藏 举报 脚本l ...

  8. [WebView学习之三]:使用WebView来创建Apps

    上一篇我们学习了([WebView学习之二]:使用Web Apps 支持不同分辨率屏),今天我们来继续学习. (博客地址:http://blog.csdn.net/developer_jiangqq) ...

  9. HBase总结(十八)Hbase rowkey设计一

    hbase所谓的三维有序存储的三维是指:rowkey(行主键),column key(columnFamily+qualifier),timestamp(时间戳)三部分组成的三维有序存储. 1.row ...

  10. Service#onStartCommand返回值解析

    Service#onStartCommand返回值解析 Service类有个生命周期方法叫onStartCommand,每次启动服务(startService)都会回调此方法.此方法的原型例如以下: ...