<em id="wxnzf"></em>

    <noscript id="wxnzf"></noscript>
<wbr id="wxnzf"></wbr>

<tr id="wxnzf"><output id="wxnzf"></output></tr>
  • <wbr id="wxnzf"><legend id="wxnzf"></legend></wbr>

    <em id="wxnzf"><span id="wxnzf"></span></em>

  • <nav id="wxnzf"></nav>
    icon

    新聞 資訊

    News and information

    PHP運行模式:CGI,Fast-CGI,PHP-FPM,PHP-Cli

    發布時間:2021-01-18

    PHP有多種運行模式,常見的Fast-CGI,PHP-FPM模式我們歸納為傳統的web模式,還有一種模式屬于命令行模式:PHP-Cli。他們之間有著怎么樣的區別,看本文就夠了。


    CGI協議模式

    CGI模式是指通用網關接口(Common Gateway Interface),它允許web服務器通過特定的協議與應用程序通信, 調用原理大概為:


    用戶請求->Web服務器接收請求->fork子進程 調用程序/執行程序->程序返回內容/程序調用結束->web服務器接收內容->返回給用戶 。


    由于每次用戶請求,都得fork創建進程調用一次程序,然后銷毀進程,所以性能較低。


    Fast-CGI 協議模式

    Fast-CGI是CGI模式的升級版,它像是一個常駐型的cgi,只要開啟后,就可一直處理請求,不再需要結束進程, 調用原理大概為:


    web服務器fast-cgi進程管理器初始化->預先fork n個進程


    用戶請求->web服務器接收請求->交給fast-cgi進程管理器->fast-cgi進程管理區接收,給其中一個空閑fast-cgi進程處理->


    處理完成,fast-cgi進程變為空閑狀態,等待下次請求->web服務器接收內容->返回給用戶。

    注意,Fast-CGI和CGI都是一種協議,開啟的進程是單獨實現該協議的進程。


    PHP-FPM模式

    PHP-FPM(FastCGI 進程管理器)用于替換 PHP FastCGI 的大部分附加功能,對于高負載網站是非常有用的。


    它的功能包括:


    支持平滑停止/啟動的高級進程管理功能;

    可以工作于不同的 uid/gid/chroot 環境下,并監聽不同的端口和使用不同的 php.ini 配置文件(可取代 safe_mode 的設置);

    stdout 和 stderr 日志記錄;

    在發生意外情況的時候能夠重新啟動并緩存被破壞的 opcode;

    文件上傳優化支持;

    "慢日志" - 記錄腳本(不僅記錄文件名,還記錄 PHP backtrace 信息,可以使用 ptrace或者類似工具讀取和分析遠程進程的運行數據)運行所導致的異常緩慢;

    fastcgi_finish_request() - 特殊功能:用于在請求完成和刷新數據后,繼續在后臺執行耗時的工作(錄入視頻轉換、統計處理等);

    動態/靜態子進程產生;

    基本 SAPI 運行狀態信息(類似Apache的 mod_status);

    基于 php.ini 的配置文件。

    PHP-FPM的工作原理大概為:


    php-fpm啟動->生成n個fast-cgi協議處理進程->監聽一個端口等待任務


    用戶請求->web服務器接收請求->請求轉發給php-fpm->php-fpm交給一個空閑進程處理 ->進程處理完成->php-fpm返回給web服務器->web服務器接收數據->返回給用戶。


    PHP-Cli模式

    php-cli模式屬于命令行模式,對于很多剛開始學php就開始wamp,wnmp的開發者來說是最陌生的一種運行模式。


    該模式不需要借助其他程序,直接在控制臺輸入php xx.php 就能執行php代碼。


    命令行模式和常規傳統的web模式明顯不一樣的是:


    沒有超時時間

    默認關閉buffer緩沖

    STDIN和STDOUT標準輸入/輸出/錯誤 的使用

    echo var_dump,phpinfo等輸出直接輸出到控制臺

    可使用的類/函數 不同

    php.ini配置的不同

    在php-cli中,是沒有超時時間的,也無法通過 set_time_limit 設置超時時間,舉個栗子:


    <?php

    set_time_limit(30);

    while (1){

        echo 1;

        sleep(1);

    }

    這段代碼,在常規web下運行,只要到30秒就會報Fatal error: Maximum execution time of 30 seconds exceeded in ......這樣的錯誤。


    而在php-cli中,這段代碼將會一直執行,一直輸出1到控制臺中。


    php有些擴展在常規web下運行時沒用/沒有意義的,例如:


    swoole擴展


    socket擴展


    模塊模式

    Apache+PHP運行時,默認使用的是模塊模式,它把php作為apache的模塊隨apache啟動而啟動,接收到用戶請求時則直接通過調用mod_php模塊進行處理,詳細內容可自行百度。


    亚洲 欧美 日韩 国产 在线,中文字幕乱码免费,很黄很刺激的免费视频,中日高清字幕版在线观看