0

0

详解PHP的执行原理和流程

不言

不言

发布时间:2018-04-20 10:49:28

|

1701人浏览过

|

来源于php中文网

原创

这篇文章介绍的内容是关于详解PHP的执行原理和流程,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

简介

  先看看下面这个过程: 
  • 我们从未手动开启过PHP的相关进程,它是随着Apache的启动而运行的; 
  • PHP通过mod_php5.so模块和Apache相连(具体说来是SAPI,即服务器应用程序编程接口); 
  • PHP总共有三个模块:内核、Zend引擎、以及扩展层; 
  • PHP内核用来处理请求、文件流、错误处理等相关操作; 
  • Zend引擎(ZE)用以将源文件转换成机器语言,然后在虚拟机上运行它; 
  • 扩展层是一组函数、类库和流,PHP使用它们来执行一些特定的操作。比如,我们需要mysql扩展来连接MySQL数据库; 
  • 当ZE执行程序时可能会需要连接若干扩展,这时ZE将控制权交给扩展,等处理完特定任务后再返还; 
  • 最后,ZE将程序运行结果返回给PHP内核,它再将结果传送给SAPI层,最终输出到浏览器上。 
  深入探讨 
  等等,没有这么简单。以上过程只是个简略版,让我们再深入挖掘一下,看看幕后还发生了些什么。 
  • Apache启动后,PHP解释程序也随之启动; 
  • PHP的启动过程有两步; 
  • 第一步是初始化一些环境变量,这将在整个SAPI生命周期中发生作用; 
  • 第二步是生成只针对当前请求的一些变量设置。

PHP启动第一步

  不清楚什么第一第二步是什么?别担心,我们接下来详细讨论一下。让我们先看看第一步,也是最主要的一步。要记住的是,第一步的操作在任何请求到达之前就发生了。 
  • 启动Apache后,PHP解释程序也随之启动; 
  • PHP调用各个扩展的MINIT方法,从而使这些扩展切换到可用状态。看看php.ini文件里打开了哪些扩展吧; 
  • MINIT的意思是“模块初始化”。各个模块都定义了一组函数、类库等用以处理其他请求。 
  一个典型的MINIT方法如下:

PHP_MINIT_FUNCTION(extension_name){  
/* Initialize functions, classes etc */  }
  • 1

    商城购物系统
    商城购物系统

    商城购物系统是一个以php+MySQL进行开发的可塑性极强的电子商品平台;商城购物系统可自定义商品栏目内容,包含分销功能,分销管理、分销订单提成完整功能,商品加购物车、商品支付、商品发货等一系列流程,包括pc端和手机H5端。

    下载
  • 2

    立即学习PHP免费学习笔记(深入)”;

  • 3

PHP启动第二步

  • 当一个页面请求发生时,SAPI层将控制权交给PHP层。于是PHP设置了用于回复本次请求所需的环境变量。同时,它还建立一个变量表,用来存放执行过程中产生的变量名和值。 
  • PHP调用各个模块的RINIT方法,即“请求初始化”。一个经典的例子是Session模块的RINIT,如果在php.ini中启用了Session模块,那在调用该模块的RINIT时就会初始化$_SESSION变量,并将相关内容读入; 
  • RINIT方法可以看作是一个准备过程,在程序执行之间就会自动启动。 
  一个典型的RINIT方法如下:

PHP_RINIT_FUNCTION(extension_name) {  
/* Initialize session variables, pre-populate variables, redefine global variables etc */  }

PHP关闭第一步

如同PHP启动一样,PHP的关闭也分两步: 
  • 一旦页面执行完毕(无论是执行到了文件末尾还是用exit或die函数中止),PHP就会启动清理程序。它会按顺序调用各个模块的RSHUTDOWN方法。 
  • RSHUTDOWN用以清除程序运行时产生的符号表,也就是对每个变量调用unset函数。 
  一个典型的RSHUTDOWN方法如下:

PHP_RSHUTDOWN_FUNCTION(extension_name) {  
/* Do memory management, unset all variables used in the last PHP call etc */  
}

PHP关闭第二步

最后,所有的请求都已处理完毕,SAPI也准备关闭了,PHP开始执行第二步: 
  • PHP调用每个扩展的MSHUTDOWN方法,这是各个模块最后一次释放内存的机会。 
  一个典型的RSHUTDOWN方法如下:

PHP_MSHUTDOWN_FUNCTION(extension_name) {  
/* Free handlers and persistent memory etc */  }

这样,整个PHP生命周期就结束了。要注意的是,只有在服务器没有请求的情况下才会执行“启动第一步”和“关闭第二步”。 
  下面的是用一些图示来说明的!

PHP底层工作原理

php底层

  从图上可以看出,php从下到上是一个4层体系 
  ①Zend引擎 
  Zend整体用纯c实现,是php的内核部分,它将php代码翻译(词法、语法解析等一系列编译过程)为可执行opcode的处理并实现相应的处理方法、实现了基本的数据结构(如hashtable、oo)、内存分配及管理、提供了相应的api方法供外部调用,是一切的核心,所有的外围功能均围绕zend实现。 
  ②Extensions 
  围绕着zend引擎,extensions通过组件式的方式提供各种基础服务,我们常见的各种内置函数(如array系列)、标准库等都是通过extension来实现,用户也可以根据需要实现自己的extension以达到功能扩展、性能优化等目的(如贴吧正在使用的php中间层、富文本解析就是extension的典型应用)。 
  ③Sapi 
  Sapi全称是Server Application Programming Interface,也就是服务端应用编程接口,sapi通过一系列钩子函数,使得php可以和外围交互数据,这是php非常优雅和成功的一个设计,通过sapi成功的将php本身和上层应用解耦隔离,php可以不再考虑如何针对不同应用进行兼容,而应用本身也可以针对自己的特点实现不同的处理方式。后面将在sapi章节中介绍 
  ④上层应用 
  这就是我们平时编写的php程序,通过不同的sapi方式得到各种各样的应用模式,如通过webserver实现web应用、在命令行下以脚本方式运行等等。

构架思想:

引擎(Zend)+组件(ext)的模式降低内部耦合 
  中间层(sapi)隔绝web server和php 
  **************************************************************** 
  如果php是一辆车,那么 
  车的框架就是php本身 
  Zend是车的引擎(发动机) 
  Ext下面的各种组件就是车的轮子 
  Sapi可以看做是公路,车可以跑在不同类型的公路上 
  而一次php程序的执行就是汽车跑在公路上。 
  因此,我们需要:性能优异的引擎+合适的车轮+正确的跑道

Apache和php的关系

Apache对于php的解析,就是通过众多Module中的php Module来完成的。

图解

  把php最终集成到Apache系统中,还需要对Apache进行一些必要的设置。这里,我们就以php的mod_php5 SAPI运行模式为例进行讲解,至于SAPI这个概念后面我们还会详细讲解。 
  假定我们安装的版本是Apache2 和 Php5,那么需要编辑Apache的主配置文件http.conf,在其中加入下面的几行内容: 
  Unix/Linux环境下: 
  LoadModule php5_module modules/mod_php5.so 
  AddType application/x-httpd-php .php 
  注:其中modules/mod_php5.so 是X系统环境下mod_php5.so文件的安装位置。 
  Windows环境下: 
  LoadModule php5_module d:/php/php5apache2.dll 
  AddType application/x-httpd-php .php 
  注:其中d:/php/php5apache2.dll 是在Windows环境下php5apache2.dll文件的安装位置。 
  这两项配置就是告诉Apache Server,以后收到的Url用户请求,凡是以php作为后缀,就需要调用php5_module模块(mod_php5.so/ php5apache2.dll)进行处理。

Apache的生命周期

图解

Apach的请求处理流程

图解

Apache请求处理循环详解

 Apache请求处理循环的11个阶段都做了哪些事情呢? 
  1、Post-Read-Request阶段 
  在正常请求处理流程中,这是模块可以插入钩子的第一个阶段。对于那些想很早进入处理请求的模块来说,这个阶段可以被利用。 
  2、URI Translation阶段 
  Apache在本阶段的主要工作:将请求的URL映射到本地文件系统。模块可以在这阶段插入钩子,执行自己的映射逻辑。mod_alias就是利用这个阶段工作的。 
  3、Header Parsing阶段 
  Apache在本阶段的主要工作:检查请求的头部。由于模块可以在请求处理流程的任何一个点上执行检查请求头部的任务,因此这个钩子很少被使用。mod_setenvif就是利用这个阶段工作的。 
  4、Access Control阶段 
  Apache在本阶段的主要工作:根据配置文件检查是否允许访问请求的资源。Apache的标准逻辑实现了允许和拒绝指令。mod_authz_host就是利用这个阶段工作的。 
  5、Authentication阶段 
  Apache在本阶段的主要工作:按照配置文件设定的策略对用户进行认证,并设定用户名区域。模块可以在这阶段插入钩子,实现一个认证方法。 
  6、Authorization阶段 
  Apache在本阶段的主要工作:根据配置文件检查是否允许认证过的用户执行请求的操作。模块可以在这阶段插入钩子,实现一个用户权限管理的方法。 
  7、MIME Type Checking阶段 
  Apache在本阶段的主要工作:根据请求资源的MIME类型的相关规则,判定将要使用的内容处理函数。标准模块mod_negotiation和mod_mime实现了这个钩子。 
  8、FixUp阶段 
  这是一个通用的阶段,允许模块在内容生成器之前,运行任何必要的处理流程。和Post_Read_Request类似,这是一个能够捕获任何信息的钩子,也是最常使用的钩子。 
  9、Response阶段 
  Apache在本阶段的主要工作:生成返回客户端的内容,负责给客户端发送一个恰当的回复。这个阶段是整个处理流程的核心部分。 
  10、Logging阶段 
  Apache在本阶段的主要工作:在回复已经发送给客户端之后记录事务。模块可能修改或者替换Apache的标准日志记录。 
  11、CleanUp阶段 
  Apache在本阶段的主要工作:清理本次请求事务处理完成之后遗留的环境,比如文件、目录的处理或者Socket的关闭等等,这是Apache一次请求处理的最后一个阶段。

LAMP架构

lamp

 从下往上四层: 
  ①liunx 属于操作系统的底层 
  ②apache服务器,属于次服务器,沟通linux和PHP 
  ③php:属于服务端编程语言,通过php_module 模块 和apache关联 
  ④mysql和其他web服务:属于应用服务,通过PHP的Extensions外 挂模块和mysql关联

相关推荐:

php的执行原理与流程的图文代码详解

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
云朵浏览器入口合集
云朵浏览器入口合集

本专题整合了云朵浏览器入口合集,阅读专题下面的文章了解更多详细地址。

0

2026.01.20

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

20

2026.01.20

PS使用蒙版相关教程
PS使用蒙版相关教程

本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

62

2026.01.19

java用途介绍
java用途介绍

本专题整合了java用途功能相关介绍,阅读专题下面的文章了解更多详细内容。

87

2026.01.19

java输出数组相关教程
java输出数组相关教程

本专题整合了java输出数组相关教程,阅读专题下面的文章了解更多详细内容。

39

2026.01.19

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

10

2026.01.19

xml格式相关教程
xml格式相关教程

本专题整合了xml格式相关教程汇总,阅读专题下面的文章了解更多详细内容。

13

2026.01.19

PHP WebSocket 实时通信开发
PHP WebSocket 实时通信开发

本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

19

2026.01.19

微信聊天记录删除恢复导出教程汇总
微信聊天记录删除恢复导出教程汇总

本专题整合了微信聊天记录相关教程大全,阅读专题下面的文章了解更多详细内容。

160

2026.01.18

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 8.9万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 8.7万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号