<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之旅 廣告
                > **CGI FsatCGI PHP-FPM PHP-CGI之間的聯系** ## 說明 ## **算是面試必問的題吧,以前對這塊理解比較模糊,花時間看了一下,整理下來** ---------- ##文章參考## Bruce's Blog: https://www.xiebruce.top/606.html 百度文庫: https://wenku.baidu.com/view/94a635b45901020207409cfe.html 博客園:https://www.cnblogs.com/itxiongwei/p/9072075.html 知乎:https://www.zhihu.com/question/55835080 CGI(公共網關接口):CGI最初是一種外部擴展應用程序與 Web 服務器通信的協議,現在常說的就是實現了CGI協議的程序。 FsatCGI:FastCGI則是在CGI基礎上的優化。CGI在高訪問量下效率會變得很低(這個問題會在下文中詳細給出),而FastCGI則完美的解決了這個問題。目前FsatCGI是通用的公共網管接口協議。 PHP-FPM:FPM是 FastCgi Process Manager的縮寫,即FastCGI的進程管理器,而PHP-FPM就是PHP的FastCGI進程管理器。 PHP-CGI:PHP-CGI同樣也是實現了FastCGI協議的PHP解釋器。只不過在5.4以后,PHP-FPM已經被集成在了PHP里,PHP-CGI就慢慢地被遺棄了。 ##CGI## <h5>CGI介紹</h5> 最早的Web服務器只是處理瀏覽器發來的HTTP靜態資源請求(圖片、視頻、HTML文件),就比如說瀏覽器需要一張圖片,Web服務器找到之后直接返回給瀏覽器。 但隨著技術的不斷發展,Web服務器也需要接收瀏覽器對于動態資源的請求,但對于像PHP/ASP這些文件Web服務器無法直接處理,就需要轉給這些文件能處理的工具處理。解釋器就可以理解為處理這些文件的工具,而CGI程序就相當于最初的解釋器。 CGI(common gateway interface 公共網關接口)起初是web服務器跟解釋器之間的通信協議,即兩者遵循CGI協議進行數據傳輸。后來CGI代指遵循CGI協議的解釋器,也就是CGI程序。 <h5>CGI程序的工作方式</h5> web服務器一般只處理靜態文件請求(如 jpg、htm、html),如果碰到一個動態腳本請求(如php),web 服務器主進程,就fork 出一個新的進程來啟動CGI程序。也就是說將動態腳本請求交給CGI程序來處理。啟動CGI程序需要一個過程,比如,讀取配置文件,加載擴展等。CGI程序啟動后,就會解析動態腳本,然后將結果返回給web服務器。最后web服務器再講記過返回給客戶端,剛才fork的進程也會隨之關閉。這樣,每次用戶請求動態腳本,web服務器都要重新fork一個新進程,將配置加載一遍,然后去啟動CGI程序,由CGI程序來處理動態腳本,處理完后進程隨之關閉。CGI模式的運行示意圖如下: ![cgi工作原理][1] ##Web服務器內置模塊## 對于CGI模式來說,每一個請求都需要fork出一個進程去重啟加載CGI程序,這中模式效率其實很低下。Web服務器內置模塊則是比CGI高效的一種方式。例如,Apache的mod_php模塊,將PHP解釋器做成模塊,加載到apache服務器中。在apache服務器在啟動的時候,就會啟動PHP模塊。當客戶端請求PHP文件是,Apache服務器不再fork出新的進程來啟動PHP解釋器,而是直接將PHP文件交給運行中的php模塊處理,顯然,這種方式下,效率比較高。 由于在Apache服務器啟東時,才會讀取php的配置文件的,加載PHP模塊,在Apache的運行過程中,不會再重新讀取php的配置文件,所以,每次我們修改了PHP的配置文件后,必須重啟apache,新的PHP配置文件才會生效,Web服務器內置模塊運行示意圖如下: ![web服務器內置模塊][2] ##FastCGI## FastCGI協議在CGI標準協議基礎上改進出來的一種協議,主要就是解決CGI每次都要Fork出子進程去加載CGI程序的問題。當客戶端請求web服務器上的動態腳本時,Web服務器會將動態腳本交給FastCGI主進程,FastCGI主進程根據情況,安排一個空閑的子進程來解釋動態腳本,處理完成后將結果返回給web服務器,web服務器再將結果返回給客戶端。客戶端請求處理完畢后,FastCGI子進程并不會隨之關閉,而是繼續等待主進程安排工作任務。所以,FastCGI的工作效率是非常高的。 FastCGI的相關定義文章:[FastCGI Specification][3] [the FastCGI Interface][4] FastCGI模式運行示意圖如下: ![請輸入圖片描述][5] ##PHP-CGI## PHP-CGI是遵循CGI協議的PHP解釋器,在5.4之前PHP_FPM通過PHP-CGI來解析PHP文件,但5.4之后,PHP-FPM已經被官方收錄,可以更高效的解析PHP。現在的PHP-CGI也同樣遵循FastCGI協議,只不過大家都在用PHP-FPM,PHP-CGI慢慢的被遺棄了。 ##PHP-FPM## FPM 是FastCGI Process Manager的縮寫,中文直譯就是FastCGI進程的管理器,而PHP-FPM就是PHP語言的FastCGI進程管理器。對于PHP5.4之前的版本來說,PHP-FPM是一個第三方的補丁包,PHP_FPM通過PHP-CGI來解析PHP文件。但在PHP5.4以后的版本里,PHP-FPM已經被集成到PHP的源碼中了,因為PHP-FPM提供了更好的PHP進程管理方式,可以有效控制內存和進程、可以平滑重載PHP配置,比spawn-fcgi具有更多優點,所以PHP-FPM被PHP官方集成了。 <h5>PHP-FPM的優點</h5> <li>支持平滑停止/啟動的高級進程管理功能;</li> <li>可以工作于不同的 uid/gid/chroot 環境下,并監聽不同的端口和使用不同的 php.ini 配置文件(可取代 safe_mode 的設置);</li> <li>stdout 和 stderr 日志記錄;</li> <li>在發生意外情況的時候能夠重新啟動并緩存被破壞的 opcode;</li> <li>文件上傳優化支持;</li> <li>&#8220;慢日志&#8221; &#8211; 記錄腳本(不僅記錄文件名,還記錄 PHP backtrace 信息,可以使用 ptrace或者類似工具讀取和分析遠程進程的運行數據)運行所導致的異常緩慢;</li> <li>fastcgi_finish_request() &#8211; 特殊功能:用于在請求完成和刷新數據后,繼續在后臺執行耗時的工作(錄入視頻轉換、統計處理等);</li> <li>動態/靜態子進程產生;</li> <li>基本 SAPI 運行狀態信息(類似Apache的 mod_status);</li> <li>基于 php.ini 的配置文件。</li> <h5>進程管理模式</h5> PHP-FPM是一個進程管理器,啟動它時,它除了有一個“主進程(master)”外,還會創建很多“子進程”。這些子進程,才是真正的“遵循通用網關接口的php解釋器”,而主進程只不過是把請求分配給這些子進程而已,所以PHP-FPM才叫“PHP FastCGI進程管理器”,當網站并發數大時,主進程會不斷把請求分配給這些子進程,從而可以同時處理高并發而不“掛掉”。 另外,子進程的多少,主進程還會“自動分配”,比如并發數大時,主進程會多創建一些子進程,用于同時處理更多的請求,而當并發數小時,則會自動關閉一些進程,從而“減少這些子進程對服務器內存的占用”,當然這個取決于PHP-FPM配置的進程管理方式(static方式不會自動)。 ? ~ ps -fe |grep "php-fpm" 502 360 1 0 25Nov20 ?? 0:17.52 /usr/local/opt/php@7.2/sbin/php-fpm --nodaemonize 502 21971 360 0 Thu02PM ?? 0:00.62 /usr/local/opt/php@7.2/sbin/php-fpm --nodaemonize 502 22233 360 0 Thu02PM ?? 0:01.33 /usr/local/opt/php@7.2/sbin/php-fpm --nodaemonize 502 22234 360 0 Thu02PM ?? 0:00.52 /usr/local/opt/php@7.2/sbin/php-fpm --nodaemonize 502 31928 584 0 5:17PM ttys003 0:00.00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn --exclude-dir=.idea --exclude-dir=.tox php-fpm <h5>PHP-FPM的進程管理方式</h5> PHP-FPM的進程管理方式有三種 <li>static:靜態方式,即子進程數是固定的,不會隨著并發數的多少而自動調整子進程數,有兩個缺點,1、當并發數少時,如果子進程太多會浪費內存,2、當并發數大時也不會自動增加子進程,比如“死板”,我們一般不會用這種方式。</li> <li>dynamic:動態分配,當空閑時,會自動縮小到最少子進程數(通過pm.min_spare_servers指定),當并發數大時,會按需求增加子進程數,當然這個增加并不是無止境的,而是有最大子進程數的(通過pm.max_children指定,另外也有空閑時的最大子進程數,通過pm.max_spare_servers指定),一般我們都采用這種進程管理方式。</li> <li>ondemand:啟動php-fpm時,只有主進程,沒有子進程,當有請求過來時,才會創建子進程,并發數越多創建的子進程數就越多,但有個極限值(由pm.max_children指定),空閑的進程會在pm.process_idle_timeout秒內被關閉,這種方式無法及時的“響應并處理”nginx的請求,雖然這會讓php-fpm在空閑時占用內存最小,但沒有必要,因為服務器不缺這點內存,這種方式一般也不會使用。</li> </ul> <h5>php-fpm平滑重啟原理</h5> <p>因為php-fpm本身并沒有類似nginx的<code>reload</code>之類的命令,你用<code>man php-fpm</code>也能看出來,確實沒有,如果你有在網上看到過<code>php-fpm reload</code>或<code>service php-fpm reload</code>之類的命令或者你使用過,它本身并不是<code>php-fpm</code>,而是一個shell腳本而已,它所在的位置有在<code>/etc/init.d/php-fpm</code>,而這個<code>reload</code>的本質,其實就是給php-fpm主進程發送<code>-SIGUSR2</code>信號,而php-fpm規定了<code>-SIGUSR2</code>信號為平滑重啟信號(參見<a href="https://www.jianshu.com/p/2ea78b789263">php-fpm信號,你造么?</a>)。<br /> <img src="https://img.xiebruce.top/2019/05/30/72d674e28c281dc028969c09363f6876.jpg" alt="Xnip2019-05-30_19-12-09.jpg" /></p> <p><strong>平滑重啟步驟:</strong><br /> &#8211; 1、master通過給子進程發送SIGQUIT信號的方式,平滑關閉所有的子進程<br /> &#8211; 2、如果過一段時間,有些子進程還沒退出,給子進程發送SIGTERM信號,強制關閉子進程<br /> &#8211; 3、如果還沒關閉,給子進程發送SIGKILL信號,強制關閉<br /> &#8211; 4、等所有的子進程退出后,master重新啟動</p> <h5>擴展文章</h5> <a href="https://mengkang.net/668.html">深入理解 FastCGI 協議以及在 PHP 中的實現</a><br /> <a href="https://segmentfault.com/q/1010000000256516">搞不清FastCgi與PHP-fpm之間是個什么樣的關系</a><br /> <a href="https://www.jianshu.com/p/c9a028c834ff">php-fpm解讀-進程管理的三種模式</a></p> ## 結尾 ## <p style="background-image: -webkit-linear-gradient(left, #3498db, #f47920 10%, #d71345 20%, #f7acbc 30%,#ffd400 40%, #3498db 50%, #f47920 60%, #d71345 70%, #f7acbc 80%, #ffd400 90%, #3498db);color: transparent;-webkit-text-fill-color: transparent;-webkit-background-clip: text;text-align:center;"> 腹有詩書氣自華,最是書香能致遠。 </p> [1]: https://blog.zxliu.cn/usr/uploads/2020/12/3444062762.jpg [2]: https://blog.zxliu.cn/usr/uploads/2020/12/1765529164.jpg [3]: http://www.mit.edu/~yandros/doc/specs/fcgi-spec.html#S1 [4]: http://www.mit.edu/afs.new/sipb/project/merakidev/src/openwrt-meraki/openwrt/build_mips/lighttpd-1.4.11/doc/fastcgi.txt [5]: https://blog.zxliu.cn/usr/uploads/2020/12/3668045550.jpg
                  <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>

                              哎呀哎呀视频在线观看