php 时间周期,php 的生命周期

e0d044a8c47e72b7748ceed940d47d3a.png

1、PHP的运行模式:

PHP两种运行模式是WEB模式、CLI模式。无论哪种模式,PHP工作原理都是一样的,作为一种SAPI运行。

1、当我们在终端敲入php这个命令的时候,它使用的是CLI。

它就像一个web服务器一样来支持php完成这个请求,请求完成后再重新把控制权交给终端。

2、当使用Apache或者别web服务器作为宿主时,当一个请求到来时,PHP会来支持完成这个请求。一般有:

多进程(通常编译为apache的模块来处理PHP请求)

多线程模式

简要的执行过程:

1. PHP是随着Apache的启动而运行的;

2. PHP通过mod_php5.so模块和Apache相连(具体说来是SAPI,即服务器应用程序编程接口);

3. PHP总共有三个模块:内核、Zend引擎、以及扩展层;

4. PHP内核用来处理请求、文件流、错误处理等相关操作;

5. Zend引擎(ZE)用以将源文件转换成机器语言,然后在虚拟机上运行它;

6. 扩展层是一组函数、类库和流,PHP使用它们来执行一些特定的操作。比如,我们需要MySQL扩展来连接MySQL数据库;

7. 当ZE执行程序时可能会需要连接若干扩展,这时ZE将控制权交给扩展,等处理完特定任务后再返还;

8. 最后,ZE将程序运行结果返回给PHP内核,它再将结果传送给SAPI层,最终输出到浏览器上。

2. 运行PHP的几个阶段:

SAPI运行PHP都经过下面几个阶段:

1、模块初始化阶段(Module init) :

即调用每个扩展源码中的的PHP_MINIT_FUNCTION中的方法初始化模块,进行一些模块所需变量的申请,内存分配等。

2、请求初始化阶段(Request init) :

即接受到客户端的请求后调用每个扩展的PHP_RINIT_FUNCTION中的方法,初始化PHP脚本的执行环境。

3、执行PHP脚本

4、请求结束(Request Shutdown) :

这时候调用每个扩展的PHP_RSHUTDOWN_FUNCTION方法清理请求现场,并且ZE开始回收变量和内存。

5、关闭模块(Module shutdown) :

Web服务器退出或者命令行脚本执行完毕退出会调用扩展源码中的PHP_MSHUTDOWN_FUNCTION 方法

3. 各种情况下的SAPI生命周期。

1. 单进程SAPI生命周期。(CGI)

CLI/CGI模式的PHP属于单进程的SAPI模式。这类的请求在处理一次请求后就关闭。也就是说每次请求都会重复这几个环节: 开始 - 请求开始 - 请求关闭 - 结束 。可以看到扩展的初始化花费了很多资源。

2. 多进程SAPI生命周期。(MPM的perfork方式)

通常PHP是编译为apache的一个模块来处理PHP请求(mod_php)。Apache一般会采用多进程模式, Apache启动后会fork出多个子进程(apache里可以指定开始fork出来的进程数)。每个进程的内存空间独立,每个子进程刚被fock出来都会经过开始和结束环节。

7ec9689c2024b650bd2e4530f94da1a2.png

3. 多线程的SAPI生命周期。(FastCGI或者MPM的work方式里的单个进程)

多线程模式和多进程中的某个进程类似,在这种模式下,只有一个服务器进程在运行着,但会同时运行很多线程,这样可以减少一些资源开销,向Module init和Module shutdown就只需要运行一遍就行了,一些全局变量也只需要初始化一次,因为线程独具的特质,使得各个请求之间方便的共享一些数据成为可能。

eab42e7870300886d851884572806e04.png

更多PHP相关技术文章,请访问PHP教程栏目进行学习!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359794.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

领域驱动设计之领域模型_在领域驱动的设计,贫乏的领域模型,代码生成,依赖项注入等方面……...

领域驱动设计之领域模型埃里克埃文斯(Eric Evans)已制定了域驱动设计(DDD)。 Martin Fowler是DDD的大力支持者和拥护者。 这些都是非凡的名字,几乎可以肯定的是,他们正在支持一些有价值的东西。 我不是在这…

struts2与struts1整合,java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory

原因:我往项目的WEB-INF/lib中导入了struts2基本的包,还有struts1的core包,以及struts2-strut1-plugin的包,但是没有导入commons-loggin-1.3.1这个包,如下图 我打开commons-loggin-1.3.1这个包看了一下,果然…

debian 查看php版本,Debian 下轻松实现 PHP 多版本共存

PHP7 的发布废弃了部分特性,一些程序或者插件当前不能很好的运行在 PHP7 上,因此如果服务器上能同时运行多个 PHP 的版本,就可以很好的解决过渡期的兼容性问题。在前面两篇文章中,我们介绍了如何在 Debian Stretch 中安装使用 PHP…

query和prototype库冲突的解决方法

我们在使用 jQuery 的过程中我们会频繁使用 $ 符号,$是JQuery的别名,所有使用$的地方也都可以使用JQuery来替换,例如 如$(#msg)等同于JQuery(#msg)的写法。 在页面中同时引入另一个js类库,并且该类库也是用了 $ 符号时&#xff0c…

php启用openssl,php开启openssl的方法

php开启openssl的方法,大多数情况下openssl是没有开启的,要想启用需要进行下简单的设置windows下开启方法:1: 首先检查php.ini中;extensionphp_openssl.dll是否存在, 如果存在的话去掉前面的注释符‘&#…

apache lucene_全文搜索Apache Lucene简介

apache lucene在本教程中,我想谈谈Apache Lucene 。 Lucene是一个开源项目,提供基于Java的索引和搜索技术。 使用其API,很容易实现全文搜索 。 我将处理Lucene Java版本 ,但请记住,还有一个名为Lucene.NET的.NET端口&a…

php 运算验证码类,php 数学运算验证码实现代码

//-------------------------------------// 文件说明:数学运算验证码// 文件作者:Jesse Lee// 最后更新:2008-09-07//-------------------------------------session_start();$sessionvar vdcode; //Session变量名称$width 150; //图像宽度…

经典ICP算法的问题

最近可能要用三维点云实现一个三维场景重建的功能,从经典的ICP算法开始,啃了一些文档,对其原理也是一知半解。 迭代最近点算法综述 大致参考了这份文档之后,照流程用MATLAB实现了一个简单的ICP算法,首先是发现这份文档…

php 405跳转,php – 返回HTTP 405的CORS预检请求

我正在尝试创建一个RESTful Web服务,并且已经停止实现PUT请求.我尝试过但未能在本网站上关注其他答案以及Mozilla的各种文章.该请求是从域wwwtest.dev-box生成的,它将转到test.dev-box(基本上是一个调用后端应用程序的前端应用程序).以下是我从Live HTTP标头中捕获的标头&#…

wowza rtsp_使用wowza和xuggler将RTMP转为RTSP

wowza rtsp注意:这是我们的“ Xuggler开发教程 ”系列的一部分。 大家好! 在过去的三个月中,我们一直在进行电话会议项目。 我们认为,使用诸如Flex之类的技术的基于Web的应用程序将是此类要求苛刻的项目的最佳方法。 随着软件的复…

iOS执行时工具-cycript

cycript是大神saurik开发的一个很强大的工具,能够让开发人员在命令行下和应用交互,在执行时查看和改动应用。它确实能够帮助你破解一些应用,但我认为这个工具主要还是用来学习其它应用的设计(主要是UI的设计及实现)。 …

开启php soap,php soap 开发文档

一. 必备知识1.wsdl(web服务标记语言)WSDL(网络服务描述语言,Web Services Description Language)是一门基于 XML 的语言,用于描述 Web Services 以及如何对它们进行访问。具体参考请访问下面网址2.soapSOAP 是一种简单的基于 XML 的协议&…

知识点2

1. DUMMY是不是检查所有的类型的权限呢?PS:不是,dummy的意思是虚拟的意思,就是说权限检查的时候有这个权限检查字段,但是不对该字段做权限检查。AUTHORITY-CHECK OBJECT Z_BRANDID ACTVT DUMMY ID BRAND FIELD p_br…

java调用jndi出错,无法使用Java JNDI上下文查找来访问对象

我正在运行Tomcat6并希望从我的Servlet访问数据源。但我得到了javax.naming.OperationNotSupportedException: cant generate an absolute name for this namespaceat org.apache.naming.NamingContext.getNameInNamespace(NamingContext.java:772)我的context.xml在HomeContro…

java是如何实现原语的_Java中的低GC:使用原语而不是包装器

java是如何实现原语的总览 有两个很好的理由在可能的地方使用原语而不是包装器。 明晰。 通过使用原语,您可以清楚地知道null值是不合适的。 性能。 使用原语通常更快。 清晰度通常比性能更重要,并且是使用它们的最佳理由。 但是,本文讨论…

MFC 错误异常,用vs添加资源并为资源定义类后报错:error C2065 : 未声明的标识符...

添加了一个Dialog资源,修改了ID之后右击资源添加了一个类,在类里面有一个成员变量: // 对话框数据 enum { IDD IDD_GETIN }; 而在编译过程中出现报错,错误代号是error C2065 : 未声明的标识符,我的第一反应是为什么…

php 正则匹配数字范围,正则表达式之匹配数字范围

最近有个需求就是根据产品编号批量下架产品,需要下架日期为16-31号之间的产品,比如编号为B201607280023匹配表达式如下:^201607(1[6-9]|2[0-9]|3[0-1]).逻辑很简单,如果是必须是1或2或3开头,如果是1开头则后面范围为6-9&#xff0…

php 取utc时间,得到UTC时间在PHP

使用gmdate将始终返回GMTdate。 语法与date相同。一个简单的gmdate()就足够了$time time(); $check $timedate("Z",$time); echo strftime("%B %d, %Y %H:%M:%S UTC", $check);正如以前在这里回答的那样 ,从PHP 5.2.0开始,您可以…

BrnShop开源网上商城第二讲:ASP.NET MVC框架

BrnShop开源网上商城第二讲:ASP.NET MVC框架 原文:BrnShop开源网上商城第二讲:ASP.NET MVC框架在团队设计BrnShop的web项目之初,我们碰到了两个问题,第一个是数据的复用和传递,第二个是大mvc框架和小mvc框架的选择。下…

tomcat不停机部署_Tomcat中的零停机部署(和回滚); 演练和清单

tomcat不停机部署亲爱的大家, 如果您认为Tomcat不能再进步,那您就错了。 Tomcat 7引入了所谓的并行部署 。 这是由SpringSource / VMWare贡献的。 简而言之,并行部署是指能够并行部署一个以上版本的Web应用程序,从而使所有版本都…