<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>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # 1.3 PHP的生命周期 # 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在這種模式下是怎么工作的。 ![](https://box.kancloud.cn/768631e934f6f205a0db9dc8e069df43_483x455.jpg) ## 2、多進程模式 **\[ps:書是2006年出版的,所以你應該理解作者說多進程是主流\]**PHP最常見的工作方式便是編譯成為Apache2 的Pre-fork MPM或者Apache1 的APXS 模式,其它web服務器也大多用相同的方式工作,在本書后面,把這種方式統一叫做多進程方式。 給它起這個名字是有原因的,不是隨便拍拍屁股拍拍腦袋定下來的。 當Apache啟動的時候,會立即把自己fork出好幾個子進程,每一個進程都有自己獨立的內存空間, 也就代表了有自己獨立的變量、函數等。在每個進程里的PHP的工作方式如下圖所示: ![](https://box.kancloud.cn/27d3b7ec633c7d4ac2c1ceeedfd77349_314x450.jpg) 因為是fork出來的,所以各個進程間的數據是彼此獨立,不會受到外界的干擾**(ps:fork后可以用管道等方式實現進程間通信)**。 這是一片獨立天地,它允許每個子進程做任何事情,玩七十碼、躲貓貓都沒人管,辦公室拿砍刀玩自殺也沒事, 下圖展示了從apache的視角來看多進程工作模式下的PHP: ![](https://box.kancloud.cn/1694c27591400e9bb8832a15f0638152_496x296.jpg) ## 3、多線程模式 隨著時代的進步,PHP越來越多的在多線程模式下工作,就像IIS的isapi和Apache MPM worker**(支持混合的多線程多進程的多路處理模塊)**。 在這種模式下,只有一個服務器進程在運行著,但會同時運行很多線程,這樣可以減少一些資源開銷, 像Module init和Module shutdown就只需要運行一次就行了,一些全局變量也只需要初始化一次, 因為線程獨具的特質,使得各個請求之間方便的共享一些數據成為可能。 > 其實多線程與MINIT、MSHUTDOWN只執行一次并沒有什么聯系,多進程模式下一樣可以實現。 下圖展示了在這種模式下PHP的工作流程: ![](https://box.kancloud.cn/965a3383240d91eba1439d696a196bce_500x261.jpg) ## 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.html) - 下一節 [線程安全](1.4.html)
                  <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>

                              哎呀哎呀视频在线观看