转载请注明文章出处:https://tlanyan.me/php-review...PHP复习系列目录PHP基础web请求cookieweb响应session数据库操作加解密自己创建ComposerComposer封装发送邮件IO流Socket编程多进程编程本文总结了PHP的执行过程及相关概念。程序架构首先看运行一个PHP程序需要哪些支持。一切的起点对于程序员开始编写PHP是有意义的,所以应用层的PHP脚本文件(包括Composer/include的各种第三方PHP代码)是必须的。脚本文件只有解析编译后才能执行,所以PHP虚拟机(通常是Zend引擎)也是必须的。另外,PHP脚本会用到很多扩展函数和类,所以扩展(包括官方的、PECL的、用户写的扩展)几乎是必须的。此外,PHP程序还需要与外界进行交互(如从命令行获取参数,从Web服务器获取请求信息)。这一层负责SAPI,所以SAPI也是必须的。综上所述,PHP程序架构从上到下有四层,分别是:应用层、SAPI层、扩展层和Zend引擎。架构关系如下图所示:(来源:http://www.nowamagic.net/libr...)SAPI层可能有些人比较陌生。SAPI提供了统一的接口,将上层应用与实际运行环境解耦。用户编写的PHP文件可以从命令行或在Apachehttpd或FPM中执行。背后的支撑工作是由SAPI提供的,开发者没有意识。通过SAPI,PHP脚本层不需要过多考虑执行的具体环境,PHP本身就可以让SAPI根据自身特点提供独特的实现。执行过程抛开各种SAPI的实现差异不谈,一个PHP程序的执行过程可以简单概括为:程序启动、Zend引擎、核心组件初始化;扩展初始化(MINIT);收到请求,扩展激活(RINIT);解析、执行PHP脚本;请求结束,扩展停用(RSHUTDOWN);卸载扩展(MSHUTDOWN);程序关闭除了345,其余步骤在整个SAPI生命周期中只会执行一次。在CGI/CLI模式下,345只执行一次。了解PHP程序的生命周期是PHP进阶的必经过程,也能帮助开发者快速定位问题。例如,如果脚本报告功能不存在,则很可能是缺少扩展名或发生加载错误;在CLI/CGI模式下,不管pconnect怎么无效,脚本一执行就释放资源;exit/die终止脚本。执行并不一定意味着流程的结束;脚本编译后驻留在内存中,不会重复执行RINIT和RSHUTDOWN,这是CLI框架相对于其他运行方式的性能提升点;等等。关于SAPI生命周期各个阶段的更多细节,请参考《深入理解PHP内核》一书。CGI、FastCGI、PHP-FPM等CGI/FastCGI/php-cgi和PHP-FPM是几个容易让PHP开发者混淆和迷惑的概念。这些概念之间的关系如下:CGI/FastCGI:网关协议,与语言无关,所以与PHP关系不大。两者的区别在于FastCGI可以独立于web服务器,运行FastCGI协议的程序成为web服务器的内容提供者(上游)。此外,与Web服务器解耦后,与FastCGI协议交互的进程具有性能好、安全稳定、支持分发等优点;php-cgi:实现FastCGI协议的PHP解析器,不能重启,热加载流畅;FPM:PHP官方的FastCGI进程管理器,可执行程序为php-fpm;支持平滑重启、热加载,运行稳定;它的管理对象不是php-cgi进程,两者没有任何关系。只有几个概念比较容易区分。事实上,让开发人员感到困惑的是以下四组概念的综合:Web服务器。常见的Apachehttpd和Nginx;SAPI。常见的有apache2handler、cli、fpm-fcgi;协议。文中提到的CGI和FastCGI;程式。即php-cgi和php-fpm。既然web服务器对于大多数人来说比较熟悉,那我就说说它和其他概念的关系吧:在使用Apachehttpd的时候,90%以上的情况都是以模块化的方式执行PHP脚本,所以就和SAPI中的apache2handler和与其他概念无关(既不是CGI也不是FastCGI协议);在使用Nginx的时候,90%的情况都是通过FastCGI协议将请求转发给FPM,所以SAPI中的fpm-fcgi、协议中的FastCGI、程序中的php-fpm这三个概念相关,与其他无关概念。总结本文简要回顾了PHP程序的体系结构和执行流程,并介绍了几个容易混淆的概念。感谢阅读,欢迎指正!参考http://www.php-internals.com/...http://www.nowamagic.net/libr...http://cuishan.win/2017/02/05...http://www.mike.org.cn/articl...https://www.kancloud.cn/nickb...http://php.net/manual/en/inst...
