深入懂得PHP内核(二)概览-PHP生命周期与Zend引擎
深入理解PHP内核(二)概览-PHP生命周期与Zend引擎
本文参考自《深入理解PHP内核》,地址:https://github.com/reeze/tipi
1、SAPI接口
SAPI(Server Application Programming Interface)指的是PHP具体应用的编程接口。PHP脚本要执行可以用很多种方式:通过web服务器、命令行、嵌入到其他程序中。
虽然通过web服务器和命令行程序执行脚本看起来很不一样,但是实际的流程是一样的。只不过是web服务器方式是将php脚本执行结果返回给web服务器,命令行是将结果打印到控制台。
脚本执行的开始都是以SAPI接口实现开始的,只是不同的SAPI接口实现会完成他们特定的工作,例如Apache的mod_php SAPI实现需要初始化从Apache获取的一些信息,在输出内容是将内容返回给Apache,其他SAPI实现也类似
2、开始和结束
(1)PHP开始执行后会经过两个阶段:处理请求之前的开始阶段和请求之后的结束阶段。开始阶段有两个过程:第一个过程是模块初始化阶段(MINIT),在整个SAPI生命周期内(例如Apache启动之后的整个生命周期或者命令行程序整个执行过程中),该过程只进行一次。第二个过程是模块激活阶段(RINIT),该过程发生在请求阶段,例如通过url请求某个页面,则在每次请求之前都会进行模块激活(RINIT请求开始)。例如PHP注册了一些扩展模块,则在MINIT阶段回调所有模块的MINIT函数。模块在这个阶段进行一些初始化工作,例如注册常量,定义模块使用的类等等。模块在实现时可以通过如下宏来实现这些回调函数:
<span style="color: #000000;">PHP_MINIT_FUNCTION(myphpextension){ </span><span style="color: #008000;">//</span><span style="color: #008000;"> 注册常量或者类等初始化操作</span> <span style="color: #0000ff;">return</span><span style="color: #000000;"> SUCCESS; }</span>
请求到达之后PHP初始化脚本的基本环境,例如创建一个执行环境,包括保存PHP运行过程中变量名称和值内容的符号表,以及当前所有的函数以及类等信息的符号表。然后PHP会调用所有模块的RINIT函数,在这个阶段各个模块也可以执行一些相关的操作,模块RINIR函数和MINIT回调函数类似:
<span style="color: #000000;">PHP_RINIT_FUNCTION(myphpextension){ </span><span style="color: #008000;">//</span><span style="color: #008000;"> 例如记录请求开始时间 </span><span style="color: #008000;">//</span><span style="color: #008000;"> 随后在请求结束的时候记录结束时间,这样我们就能记录下处理请求所花费的时间了</span> <span style="color: #0000ff;">return</span><span style="color: #000000;"> SUCCESS;}</span>
请求处理完之后就进入结束阶段,一般脚本执行到末尾或者通过调用die()或exit()函数,PHP都将进入结束阶段。结束阶段也有两个环节:一个在请求结束后停用模块(RSHUTDOWN,对应RINIT),一个在SAPI生命周期结束(web服务器退出或者命令行脚本执行完毕退出)时关闭模块(MSHUTDOWN,对应MINIT)。
<span style="color: #000000;">PHP_RSHUTDOWN_FUNCTION(myphpextension){ </span><span style="color: #008000;">//</span><span style="color: #008000;"> 例如记录请求结束时间,并把相应的信息写入到日志文件中</span> <span style="color: #0000ff;">return</span><span style="color: #000000;"> SUCCESS;}</span>
(2)单进程SAPI生命周期
CLI/CGI模式的PHP属于单进程的SAPI模式。这类请求在处理一次请求后就关闭了。SAPI生命周期:开始-请求开始-请求关闭-结束
(3)多进程SAPI生命周期
通常PHP编译成Apache的一个模块,Apache通常采用多进程模式,Apache启动后会fork出多个子进程,每个进程的内存空间独立,每个子进程都会经过开始和结束环节,不过每个进程的开始阶段只在进程fork出来以后进行,在整个进程的生命周期内可能有可能处理多个请求。只有在Apache关闭或者进程被结束之后才进行关闭阶段,在这两个阶段会随着每个请求重复请求开始-请求关闭的环节
(4)多线程模式和多进程中的某个进程类似,不同的是在整个进程的生命周期内会并行的重复着请求开始-请求关闭的环节。
3、Zend引擎
Zend引擎是PHP实现的核心,提供了语言实现上的基础设施。例如PHP语法的实现、脚本的编译运行环境、扩展机制以及内存管理等。这里的PHP指的是官方的PHP实现(另外还有facebook的Hiphop,现已发展成为HHVM,到目前为止(此项目)PHP还没有一个标准的语言规范),而PHP则提供了请求处理和其他Web服务器的接口(SAPI)

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

PHP在現代Web開發中仍然重要,尤其在內容管理和電子商務平台。 1)PHP擁有豐富的生態系統和強大框架支持,如Laravel和Symfony。 2)性能優化可通過OPcache和Nginx實現。 3)PHP8.0引入JIT編譯器,提升性能。 4)雲原生應用通過Docker和Kubernetes部署,提高靈活性和可擴展性。

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP和Python各有優勢,適合不同場景。 1.PHP適用於web開發,提供內置web服務器和豐富函數庫。 2.Python適合數據科學和機器學習,語法簡潔且有強大標準庫。選擇時應根據項目需求決定。

PHP成為許多網站首選技術棧的原因包括其易用性、強大社區支持和廣泛應用。 1)易於學習和使用,適合初學者。 2)擁有龐大的開發者社區,資源豐富。 3)廣泛應用於WordPress、Drupal等平台。 4)與Web服務器緊密集成,簡化開發部署。

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

本文介紹幾種檢查Debian系統OpenSSL配置的方法,助您快速掌握系統安全狀態。一、確認OpenSSL版本首先,驗證OpenSSL是否已安裝及版本信息。在終端輸入以下命令:opensslversion若未安裝,系統將提示錯誤。二、查看配置文件OpenSSL主配置文件通常位於/etc/ssl/openssl.cnf。您可以使用文本編輯器(例如nano)查看:sudonano/etc/ssl/openssl.cnf此文件包含密鑰、證書路徑及加密算法等重要配置信息。三、利用ope

啟動 Apache 的步驟如下:安裝 Apache(命令:sudo apt-get install apache2 或從官網下載)啟動 Apache(Linux:sudo systemctl start apache2;Windows:右鍵“Apache2.4”服務並選擇“啟動”)檢查是否已啟動(Linux:sudo systemctl status apache2;Windows:查看服務管理器中“Apache2.4”服務的狀態)啟用開機自動啟動(可選,Linux:sudo systemctl
