<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 1.3 PHP的生命周期 一個PHP實例,無論通過http請求調用的,還是從命令行啟動的,都會向我們上一節說的那樣, 依次進行Module init、Request init、Request Shutdown、Module shutdown四個過程, 當然之間還會執行腳本自己的邏輯。 那么兩種init和兩種shutdown各會執行多少次、各自的執行頻率有多少呢? 這取決于PHP是用什么sapi與宿主通信的。最常見的四種方式如下所列: * 直接以CLI/CGI模式調用 * 多進程模式 * 多線程模式 * Embedded(嵌入式,在自己的C程序中調用Zend Engine) ## 1、CLI/CGI CLI和CGI的SAPI是相當特殊的,因為這時PHP的生命周期完全在一個單獨的請求中完成。雖然簡單,不過我們以前提過的兩種init和兩種shutdown仍然都會被執行。圖1.1展示了PHP在這種模式下是怎么工作的。 <p style="text-align:center"><img src="http://www.walu.cc/phpbook/image/01fig01.jpg" /></p> ## 2、多進程模式 **[ps:書是2006年出版的,所以你應該理解作者說多進程是主流]** PHP最常見的工作方式便是編譯成為Apache2 的Pre-fork MPM或者Apache1 的APXS 模式,其它web服務器也大多用相同的方式工作,在本書后面,把這種方式統一叫做多進程方式。 給它起這個名字是有原因的,不是隨便拍拍屁股拍拍腦袋定下來的。 當Apache啟動的時候,會立即把自己fork出好幾個子進程,每一個進程都有自己獨立的內存空間, 也就代表了有自己獨立的變量、函數等。在每個進程里的PHP的工作方式如下圖所示: <p style="text-align:center"><img src="http://www.walu.cc/phpbook/image/01fig02.jpg" /></p> 因為是fork出來的,所以各個進程間的數據是彼此獨立,不會受到外界的干擾**(ps:fork后可以用管道等方式實現進程間通信)**。 這是一片獨立天地,它允許每個子進程做任何事情,玩七十碼、躲貓貓都沒人管,辦公室拿砍刀玩自殺也沒事, 下圖展示了從apache的視角來看多進程工作模式下的PHP: <p style="text-align:center"><img src="http://www.walu.cc/phpbook/image/01fig03.jpg" /></p> ## 3、多線程模式 隨著時代的進步,PHP越來越多的在多線程模式下工作,就像IIS的isapi和Apache MPM worker**(支持混合的多線程多進程的多路處理模塊)**。 在這種模式下,只有一個服務器進程在運行著,但會同時運行很多線程,這樣可以減少一些資源開銷, 像Module init和Module shutdown就只需要運行一次就行了,一些全局變量也只需要初始化一次, 因為線程獨具的特質,使得各個請求之間方便的共享一些數據成為可能。 > 其實多線程與MINIT、MSHUTDOWN只執行一次并沒有什么聯系,多進程模式下一樣可以實現。 下圖展示了在這種模式下PHP的工作流程: <p style="text-align:center"><img src="http://www.walu.cc/phpbook/image/01fig04.jpg" /></p> ## 4、Embed Embed SAPI是一種比較特殊的sapi,容許你在C/C++語言中調用PHP/ZE提供的函數。 并且這種sapi和上面的三種一樣,按Module Init、Request Init、Rshutdown、mshutdown的流程執行著。 當然,這只是其中一種情況。因為特定的應用有自己特殊的需求,只是在處理PHP腳本這個環節基本一致。 真正令emebed模式獨特的是因為它可能隨時嵌入到某個程序里面去(**比如你的test.exe里**), 然后被當作腳本的一部分在一個請求的時候執行。 控制權在PHP和原程序間來回傳遞。關于嵌入式的PHP在第20章會有應用,到時我們再用實例介紹這個不經常使用的sapi。 ## 關于Embed SAPI應用的文章 * [Laruence大哥的使用PHP Embed SAPI實現Opcodes查看器](http://www.laruence.com/2008/09/23/539.html) </li> ## links * [目錄](<preface.md>) * 上一節 [PHP的啟動與終止](<1.2.md>) * 下一節 [線程安全](<1.4.md>)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看