PHP的架构简述以及apache处理php请求的生命周期

PHP的架构图:

SAPI指的是PHP具体应用的编程接口, 就像PC一样,无论安装哪些操作系统,只要满足了PC的接口规范都可以在PC上正常运行, PHP脚本要执行有很多种方式,通过Web服务器,或者直接在命令行下,也可以嵌入在其他程序中。

通常,我们使用Apache或者Nginx这类Web服务器来测试PHP脚本,或者在命令行下通过PHP解释器程序来执行。 脚本执行完后,Web服务器应答,浏览器显示应答信息,或者在命令行标准输出上显示内容。

我们很少关心PHP解释器在哪里。虽然通过Web服务器和命令行程序执行脚本看起来很不一样, 实际上它们的工作流程是一样的。命令行参数传递给PHP解释器要执行的脚本, 相当于通过url请求一个PHP页面。脚本执行完成后返回响应结果,只不过命令行的响应结果是显示在终端上。

脚本执行的开始都是以SAPI接口实现开始的。只是不同的SAPI接口实现会完成他们特定的工作, 例如Apache的mod_php SAPI实现需要初始化从Apache获取的一些信息,在输出内容是将内容返回给Apache, 其他的SAPI实现也类似。

SAPI提供了一个和外部通信的接口, 对于PHP5.2,默认提供了很多种SAPI, 常见的给apache的mod_php5,CGI,给IIS的ISAPI,还有Shell的CLI,本文就从CGI SAPI入手 ,介绍SAPI的机制。 虽然CGI简单,但是不用担心,它包含了绝大部分内容,足以让你深刻理解SAPI的工作原理。

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

PHP启动第一步

不清楚什么第一第二步是什么?别担心,我们接下来详细讨论一下。让我们先看看第一步,也是最主要的一步。要记住的是,第一步的操作在任何请求到达之前就发生了。

启动Apache后,PHP解释程序也随之启动。PHP调用各个扩展的MINIT方法,从而使这些扩展切换到可用状态。看看php.ini文件里打开了哪些扩展吧。 MINIT的意思是“模块初始化”。各个模块都定义了一组函数、类库等用以处理其他请求。

PHP启动第二步

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


PHP关闭第一步

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

PHP关闭第二步

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

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


apache处理php请求生命周期:

多进程SAPI生命周期



### Android 应用或组件的生命周期方法及其调用时机 #### Activity 的三种基本状态 Activity 可以处于以下三种主要状态之一: - **激活 (Running)**:完全显示在界面上,并且拥有焦点,即正在与用户交互。 - **暂停 (Paused)**:部分可见但失去焦点,通常是因为被半透明对话框或其他非全屏 Activity 遮挡。 - **停止 (Stopped)**:完全不可见且无焦点,意味着已被其他 Activity 完全覆盖并压入堆栈底部。 这些状态转换由特定事件触发,在不同状态下执行相应的生命周期回调函数来管理资源分配界面更新操作[^2]。 #### Activity 生命周期的主要阶段及对应的方法 以下是七个核心生命周期方法以及它们各自的作用范围: - `onCreate(Bundle savedInstanceState)` 当创建一个新的实例时调用此方法;用于初始化必需的对象属性其他启动配置工作。如果应用程序因某些原因终止后重新加载,则可以通过传递给该参数保存的数据恢复之前的状态信息。 - `onStart()` 此活动变得对用户可见前立即调用;可以在此处完成任何最终准备动作以便向用户提供视觉反馈。 - `onResume()` 用户现在可以直接与其互动了——它已经获得了输入焦点。这是最活跃的一个时期,适合频繁刷新 UI 或者开启传感器监听器等耗电行为。 - `onPause()` 接收到即将离开前台的通知;应该释放那些即使短暂丢失也不会影响用户体验的重要资源(如关闭数据库连接),同时考虑持久化临时数据以防意外退出造成损失。 - `onStop()` 活动不再可见于屏幕上之后立刻发生;此时可进一步清理更多长期占用系统资源的操作项,例如取消网络请求、注销广播接收器注册表单等等。 - `onRestart()` 如果当前 activity 已经 stoped 并再次变为 visible 则会先经过这里再进入 onStart 流程;可用于处理从后台返回到前台所需做的准备工作。 - `onDestroy()` 实例即将销毁之际最后一次机会做些扫尾事宜,比如断开线程池链接或是移除本地通知服务之类的事情。不过需要注意的是,由于异常情况的存在,这并不总是能够得到保证被执行的机会。 ```java @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override protected void onStart() { super.onStart(); } @Override protected void onResume() { super.onResume(); } @Override protected void onPause() { super.onPause(); } @Override protected void onStop() { super.onStop(); } @Override protected void onRestart() { super.onRestart(); } @Override protected void onDestroy() { super.onDestroy(); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值