<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>潘锦的空间 &#187; Zend引擎</title>
	<atom:link href="https://www.phppan.com/tag/zend%e5%bc%95%e6%93%8e/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.phppan.com</link>
	<description>SaaS SaaS架构 团队管理 技术管理 技术架构 PHP 内核 扩展 项目管理</description>
	<lastBuildDate>Sat, 04 Apr 2026 01:19:58 +0000</lastBuildDate>
	<language>zh-CN</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=3.9.40</generator>
	<item>
		<title>TIPI0201–PHP生命周期和Zend引擎</title>
		<link>https://www.phppan.com/2011/01/tipi0201/</link>
		<comments>https://www.phppan.com/2011/01/tipi0201/#comments</comments>
		<pubDate>Fri, 28 Jan 2011 06:08:52 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[PHP生命周期]]></category>
		<category><![CDATA[TIPI]]></category>
		<category><![CDATA[Zend引擎]]></category>
		<category><![CDATA[深入理解PHP内核]]></category>

		<guid isPermaLink="false">http://www.phppan.com/?p=1238</guid>
		<description><![CDATA[一切的开始: SAPI接口 通常我们编写PHP Web程序都是通过Apache或者Nginx这类Web服务器来 [&#8230;]]]></description>
				<content:encoded><![CDATA[<h2 style="font-weight: bold; font-family: 'Microsoft YaHei', Helvetica, Arial, sans-serif; font-size: 1.2em; color: #333333;">一切的开始: SAPI接口</h2>
<p style="text-indent: 2em;">通常我们编写PHP Web程序都是通过Apache或者Nginx这类Web服务器来测试脚本. 或者在命令行下通过php程序来执行PHP脚本. 执行完成脚本后，服务器应答，浏览器显示应答信息,或者在命令结束后在标准输出显示内容. 我们很少关心PHP解释器在哪里. 虽然通过Web服务器和命令行程序执行 脚本看起来很不一样. 实际上她们的工作是一样的. 命令行程序和Web程序类似, 命令行参数传递给要执行的脚本,相当于通过url 请求一个php页面. 脚本戳里完成后返回响应结果,只不过命令行响应的结果是显示在终端上. 脚本执行的开始都是通过SAPI接口 进行的. 下一节将对SAPI进行更为深入的介绍.</p>
<h2 style="font-weight: bold; font-family: 'Microsoft YaHei', Helvetica, Arial, sans-serif; font-size: 1.2em; color: #333333;">开始和结束</h2>
<p style="text-indent: 2em;">PHP通过SAPI开始以后会经过两个主要的阶段. 处理请求之前的开始阶段和请求之后的结束阶段. 开始阶段有两个过程, 第一个是在 整个SAPI生命周期内(例如Apache启动以后的整个生命周期内或者命令行程序整个执行过程中)的开始阶段(MINIT),该阶段只进行一次. 第二个过程 发生在请求阶段,例如通过url请求某个页面.则在每次请求之前都会进行初始化过程(RINIT请求开始). 例如PHP注册了一些PHP模块,则在MINIT阶段会回调所有模块的MINIT函数. 模块在这个阶段可以进行一些初始化工作,例如注册常量, 定义 模块使用的类等等. 一般的模块回调函数</p>
<pre style="background-color: #333333; color: #ffffff; font: normal normal normal 13px/normal 'Bitstream Vera Sans Mono', 'DejaVu Sans Mono', 'Courier New', monospace; overflow-x: auto; overflow-y: auto; padding: 10px;">PHP_MINIT_FUNCTION<span style="color: #ffffff;">(</span>myphpextension<span style="color: #ffffff;">)</span>
<span style="color: #ffffff;">{</span>
    <span style="color: #bc9458; font-style: italic;">// 注册常量或者类等初始化操作</span>
    <span style="color: #ff8400;">return</span> SUCCESS<span style="color: #e0882f;">;</span> 
<span style="color: #ffffff;">}</span></pre>
<p style="text-indent: 2em;">请求到达之后PHP初始化执行脚本的基本环境,例如创建一个执行环境,包括保存php运行过程中变量名称和变量值内容的符号表. 以及当前所有 的函数以及类等信息的符号表. 然后PHP会调用所有模块RINIT函数, 在这个阶段各个模块也可以执行一些相关的操作, 模块的RINIT函数和MINIT函数类似</p>
<pre style="background-color: #333333; color: #ffffff; font: normal normal normal 13px/normal 'Bitstream Vera Sans Mono', 'DejaVu Sans Mono', 'Courier New', monospace; overflow-x: auto; overflow-y: auto; padding: 10px;">PHP_RINIT_FUNCTION<span style="color: #ffffff;">(</span>myphpextension<span style="color: #ffffff;">)</span>
<span style="color: #ffffff;">{</span>
    <span style="color: #bc9458; font-style: italic;">// 例如记录请求开始时间</span>
    <span style="color: #bc9458; font-style: italic;">// 随后在请求结束的时候记录结束时间.这样我们就能够记录下处理请求所花费的时间了</span>
    <span style="color: #ff8400;">return</span> SUCCESS<span style="color: #e0882f;">;</span> 
<span style="color: #ffffff;">}</span></pre>
<p style="text-indent: 2em;">请求处理完后就进入了结束阶段, 一般脚本执行到末尾或者通过调用exit()或者die()函数,php都将进入结束阶段. 和开始阶段对应,结束阶段也分为 两个环节,一个在请求结束后(RSHUWDOWN),一个在SAPI生命周期结束时(MSHUTDOWN).</p>
<pre style="background-color: #333333; color: #ffffff; font: normal normal normal 13px/normal 'Bitstream Vera Sans Mono', 'DejaVu Sans Mono', 'Courier New', monospace; overflow-x: auto; overflow-y: auto; padding: 10px;">PHP_RSHUTDOWN_FUNCTION<span style="color: #ffffff;">(</span>myphpextension<span style="color: #ffffff;">)</span>
<span style="color: #ffffff;">{</span>
    <span style="color: #bc9458; font-style: italic;">// 例如记录请求结束时间, 并把相应的信息写入到日至文件中.</span>
    <span style="color: #ff8400;">return</span> SUCCESS<span style="color: #e0882f;">;</span> 
<span style="color: #ffffff;">}</span></pre>
<blockquote style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-left: 60px; padding-right: 20px; background-image: url(http://localhost/git/tipi/web/images/note.png); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #dfdfdf; border-top-width: 1px; border-bottom-width: 1px; border-top-style: solid; border-bottom-style: solid; border-top-color: #aaaaaa; border-bottom-color: #aaaaaa; border-left-width: 0px; border-left-style: initial; border-left-color: initial; border-right-width: 0px; border-right-style: initial; border-right-color: initial; background-position: 15px 8px; background-repeat: no-repeat no-repeat;">
<p style="text-indent: 0px;">想要了解扩展开发的相关内容,请参考第十三章 扩展开发</p>
</blockquote>
<h3 style="font-weight: bold; font-family: 'Microsoft YaHei', Helvetica, Arial, sans-serif; font-size: 1.1em; color: #333333;">单进程SAPI生命周期</h3>
<p style="text-indent: 2em;">CLI/CGI模式的PHP属于单进程的SAPI模式. 这类的请求只处理一次请求就关闭. 也就是只会经过如下几个环节 开始 &#8211; 请求开始 &#8211; 请求关闭 &#8211; 结束 SAPI 接口就完成了其生命周期</p>
<h3 style="font-weight: bold; font-family: 'Microsoft YaHei', Helvetica, Arial, sans-serif; font-size: 1.1em; color: #333333;">多进程SAPI生命周期</h3>
<p style="text-indent: 2em;">通常PHP是编译为一个apache的模块来处理PHP请求的. 通常Apache会采用多进程模式, apache启动后fork出多个子进程, 每个进程的内存空间独立, 每个子进程都会经过开始和结束环节,不过每个进程的开始阶段只在进程fork出来以来后进行, 在整个进程的生命周期内可能会处理多个请求. 只有 在Apache关闭或者进程被结束之后才会进行关闭阶段,在这两个阶段之间会随着每个请求重复请求开始-请求关闭的环节.</p>
<h3 style="font-weight: bold; font-family: 'Microsoft YaHei', Helvetica, Arial, sans-serif; font-size: 1.1em; color: #333333;">多线程的SAPI生命周期</h3>
<p style="text-indent: 2em;">而在多线程模式下和多进程中的某个进程类似,不同的是在整个进程的生命周期内会<strong>并行</strong>的重复着 请求开始-请求关闭的环节</p>
<h2 style="font-weight: bold; font-family: 'Microsoft YaHei', Helvetica, Arial, sans-serif; font-size: 1.2em; color: #333333;">Zend引擎</h2>
<p style="text-indent: 2em;">Zend引擎作为PHP实现的核心,提供了语言实现上的基础设施.例如: PHP的语法实现, 脚本的编译运行环境, 扩展机制以及内存管理等, 可以说Zend引擎是PHP的核心, 当然这里的PHP指的是官方的PHP实现(除了官方的实现,目前比较知名的有facebook的hiphop实现,不过到目前为止,PHP还没有一个标准的语言规范), 而PHP则提供了请求处理和其他Web服务器的接口(SAPI).</p>
<h2 style="font-weight: bold; font-family: 'Microsoft YaHei', Helvetica, Arial, sans-serif; font-size: 1.2em; color: #333333;">参考文献</h2>
<hr style="border: 1px dashed #cccccc;" />
<p style="text-indent: 2em;">Extending and Embedding PHP</p>
<p style="text-indent: 2em;">
<p style="text-indent: 2em;">作者：TIPI团队</p>
]]></content:encoded>
			<wfw:commentRss>https://www.phppan.com/2011/01/tipi0201/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
