<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>https://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>https://jackxiang.com/post//</link>
<title><![CDATA[PHP是如何显示“你好世界”的？]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Tue, 29 Dec 2009 05:49:56 +0000</pubDate> 
<guid>https://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	你有没有想过PHP是怎么在浏览器里输出“你好世界”的？我也是看了PHP内核和扩展后才知道的。也许有些朋友也想知道其中原理，那就让我们开始吧。<br/>　　在上一篇网志里我简单介绍了“在我浏览这个页面之前都发生了些什么？”这个问题。如果你错过了就点这里看看吧。现在我要讨论的是“PHP是怎样在浏览器里输出内容”这个问题。<br/><br/>简介<br/><br/>　　先看看下面这个过程：<br/><br/>我们从未手动开启过PHP的相关进程，它是随着Apache的启动而运行的； <br/>PHP通过mod_php5.so模块和Apache相连（具体说来是SAPI，即服务器应用程序编程接口）； <br/>PHP总共有三个模块：内核、Zend引擎、以及扩展层； <br/>PHP内核用来处理请求、文件流、错误处理等相关操作； <br/>Zend引擎（ZE）用以将源文件转换成机器语言，然后在虚拟机上运行它； <br/>扩展层是一组函数、类库和流，PHP使用它们来执行一些特定的操作。比如，我们需要mysql扩展来连接MySQL数据库； <br/>当ZE执行程序时可能会需要连接若干扩展，这时ZE将控制权交给扩展，等处理完特定任务后再返还； <br/>最后，ZE将程序运行结果返回给PHP内核，它再将结果传送给SAPI层，最终输出到浏览器上。 <br/>深入探讨<br/><br/>　　等等，没有这么简单。以上过程只是个简略版，让我们再深入挖掘一下，看看幕后还发生了些什么。<br/><br/>Apache启动后，PHP解释程序也随之启动； <br/>PHP的启动过程有两步； <br/>第一步是初始化一些环境变量，这将在整个SAPI生命周期中发生作用； <br/>第二步是生成只针对当前请求的一些变量设置。 <br/>PHP启动第一步<br/><br/>　　不清楚什么第一第二步是什么？别担心，我们接下来详细讨论一下。让我们先看看第一步，也是最主要的一步。要记住的是，第一步的操作在任何请求到达之前就发生了。<br/><br/>启动Apache后，PHP解释程序也随之启动； <br/>PHP调用各个扩展的MINIT方法，从而使这些扩展切换到可用状态。看看php.ini文件里打开了哪些扩展吧； <br/>MINIT的意思是“模块初始化”。各个模块都定义了一组函数、类库等用以处理其他请求。 <br/>　　一个典型的MINIT方法如下：<br/><br/>PHP_MINIT_FUNCTION(extension_name)&#123;<br/><br/> /* Initialize functions, classes etc */<br/><br/>&#125;<br/><br/>PHP启动第二步<br/><br/>当一个页面请求发生时，SAPI层将控制权交给PHP层。于是PHP设置了用于回复本次请求所需的环境变量。同时，它还建立一个变量表，用来存放执行过程中产生的变量名和值。 <br/>PHP调用各个模块的RINIT方法，即“请求初始化”。一个经典的例子是Session模块的RINIT，如果在php.ini中启用了Session模块，那在调用该模块的RINIT时就会初始化$_SESSION变量，并将相关内容读入； <br/>RINIT方法可以看作是一个准备过程，在程序执行之间就会自动启动。 <br/>　　一个典型的RINIT方法如下：<br/><br/>PHP_RINIT_FUNCTION(extension_name) &#123;<br/><br/> /* Initialize session variables, pre-populate variables, redefine global variables etc */<br/><br/>&#125;<br/><br/>PHP关闭第一步<br/><br/>　　如同PHP启动一样，PHP的关闭也分两步：<br/><br/>一旦页面执行完毕（无论是执行到了文件末尾还是用exit或die函数中止），PHP就会启动清理程序。它会按顺序调用各个模块的RSHUTDOWN方法。 <br/>RSHUTDOWN用以清除程序运行时产生的符号表，也就是对每个变量调用unset函数。 <br/>　　一个典型的RSHUTDOWN方法如下：<br/><br/>PHP_RSHUTDOWN_FUNCTION(extension_name) &#123;<br/><br/> /* Do memory management, unset all variables used in the last PHP call etc */<br/><br/>&#125;<br/><br/>PHP关闭第二步<br/><br/>　　最后，所有的请求都已处理完毕，SAPI也准备关闭了，PHP开始执行第二步：<br/><br/>PHP调用每个扩展的MSHUTDOWN方法，这是各个模块最后一次释放内存的机会。 <br/>　　一个典型的RSHUTDOWN方法如下：<br/><br/>PHP_MSHUTDOWN_FUNCTION(extension_name) &#123;<br/><br/> /* Free handlers and persistent memory etc */<br/><br/>&#125;<br/><br/>　　这样，整个PHP生命周期就结束了。要注意的是，只有在服务器没有请求的情况下才会执行“启动第一步”和“关闭第二步”。<br/>
]]>
</description>
</item><item>
<link>https://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] PHP是如何显示“你好世界”的？]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>https://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>