站長資訊網
        最全最豐富的資訊網站

        一文帶你深入剖析PHP-FMP

        本篇文章給大家詳解介紹一下PHP-FMP。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有所幫助。

        一文帶你深入剖析PHP-FMP

        什么是php-fpm

        • 在了解php-fpm之前,請大家先思考一個問題,一個用戶發起了一個web(niginx服務器)請求,在php代碼里面,那么我們怎么樣才可以通過 $_POST,$_GET,$_SERVER獲取一些請求信息呢?我們應該參照什么格式去組裝數據呢?

        其實我們知道,每種動態語言,也就是解釋性語言,都需要通過對應的解析器才能被服務器(這里指web服務器)識別,但是解釋器和服務器 必須遵循某種協議,雙方才能夠正常通信,那么這種協議就是CGI協議,但是CGI的機制是每響應一次web請求,都會創建和初始化一個新的處理進程,請求結束就kill掉這個進程。那每次請求,都要執行這三步 創建->初始化->結束,那其實這個過程不僅浪費了資源,而且效率也很低。那怎么辦?FastCGI應時而生,作為CGI的改良版本,FastCGI會啟動一個常駐服務進程,這個進程不需要管理生命周期,也就避免了進程的重復的創建和結束,另一方面,不需要再重復的讀取環境變量,每當有web請求過來,由FastCGI管理器,也就那個常駐服務進程去啟動CGI解釋器進程

        一文帶你深入剖析PHP-FMP

        • 好了,既然有了CGI,那么針對這些解釋性語言,比如php phython,都要根據自己的語言做一個適配吧。那么php官方就弄出來了PHP-CGI,php定制版的CGI。
        • 但是隨著使用,大家發現了PHP-CGI的問題

        1.修改php.ini 后必須重啟PHP-CGI才可以生效,而不能實現平滑重啟 2.直接干掉PHP-CGI,php就不能運行了,這顯然是不能接受的 3.這玩意不會自己管理進程,它只能解析請求,返回結果

        那么FastCGI都已經到來了,php的FastCGI還會遠嗎,當然不會,到 2004年一個叫 Andrei Nigmatulin的屌絲發明了PHP-FPM,PHP-FMP 全名叫做PHP-FASTCGI Process Manager,說白了就是php定制版的FastCGI(這里強調一下,不管是PHP-CGI 還是 PHP-FPM都是為了實現CGI協議,而不是一種新的協議),其實有一句話剛才我沒說,網上很多人說PHP-CGI 就是 php管理FAST-CGI的一種程序,那你現在知道了PHP-FMP 全名叫做PHP-FASTCGI Process Manager之后,你可以理直氣壯的跟他們說no,并給他們普及一下這個知識點了。

        php-fpm的進程包括 master(常駐服務程序)和worker進程兩種

        master進程
        • master負責進程的調度(比如worker進程不夠的時候去fork一個子進程)
        • 負責監聽端口,一般是9000這個端口,可以在配置文件里面設置,當然,還有另外一種方式,就是通過socket,可以通過netstat -nap | grep master的進程號 查看端口信息(9000端口其實就是tcp的通信方式,而socket是說的unix socket,從效率上來說,unix socket顯然是最好的,因為它是進程之間的通信,但是unix socket要保證是在一臺服務器,如果是不同機器之間的通信,還是要使用tcp通信)

        一文帶你深入剖析PHP-FMP

        一文帶你深入剖析PHP-FMP

        • 接收來自服務器的請求
        work進度 看名字就知道了,就是真正的打工階級,代碼真正執行的地方

        一文帶你深入剖析PHP-FMP

        • 再來看看php-fmp和nignx是怎么通信的

        以socker通信為栗子,nginx的conf文件里面,可以看到下面這段信息

                location ~ [^/].php(/|$)         {             try_files $uri =404;             fastcgi_pass  unix:/tmp/php-cgi.sock;             fastcgi_index index.php;             include fastcgi.conf;         }

        相信這段信息大家都可以看明白,/tmp/php-cgi.sock 就是php和nginx聯系的橋梁,同時我們也看到了include fastcgi.conf,我們來看一下

        root@6d05153a8988:/usr/local/nginx/conf# cat fastcgi.conf  fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name; fastcgi_param  QUERY_STRING       $query_string; fastcgi_param  REQUEST_METHOD     $request_method; fastcgi_param  CONTENT_TYPE       $content_type; fastcgi_param  CONTENT_LENGTH     $content_length;  fastcgi_param  SCRIPT_NAME        $fastcgi_script_name; fastcgi_param  REQUEST_URI        $request_uri; fastcgi_param  DOCUMENT_URI       $document_uri; fastcgi_param  DOCUMENT_ROOT      $document_root; fastcgi_param  SERVER_PROTOCOL    $server_protocol; fastcgi_param  REQUEST_SCHEME     $scheme; fastcgi_param  HTTPS              $https if_not_empty;  fastcgi_param  GATEWAY_INTERFACE  CGI/1.1; fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;  fastcgi_param  REMOTE_ADDR        $remote_addr; fastcgi_param  REMOTE_PORT        $remote_port; fastcgi_param  SERVER_ADDR        $server_addr; fastcgi_param  SERVER_PORT        $server_port; fastcgi_param  SERVER_NAME        $server_name;  # PHP only, required if PHP was built with --enable-force-cgi-redirect fastcgi_param  REDIRECT_STATUS    200; fastcgi_param PHP_ADMIN_VALUE "open_basedir=NULL";

        我們看到了一些熟悉的,比如REMOTE_ADDR,REQUEST_URI,現在你應該明白了,我們通過$_SERVER獲取到的信息就是這個配置文件里面指定的

        我們再來看一下php-fmp的配置文件(請注意看里面的注釋,我不做解釋了)

        root@6d05153a8988:/usr/local/php/etc# cat php-fpm.conf [global] pid = /usr/local/php/var/run/php-fpm.pid error_log = /usr/local/php/var/log/php-fpm.log log_level = notice  [www] listen = /tmp/php-cgi.sock listen.backlog = -1 listen.allowed_clients = 127.0.0.1 listen.owner = www listen.group = www listen.mode = 0666 user = www group = www # 如何控制子進程,選項有static和dynamic #區別: #如果dm設置為 static,那么其實只有pm.max_children這個參數生效。系統會開#啟設置數量的php-fpm進程。 #如果dm設置為 dynamic,那么pm.max_children參數失效,后面3個參數生效。 #系統會在php-fpm運行開始 的時候啟動pm.start_servers個php-fpm進程, #然后根據系統的需求動態在pm.min_spare_servers和pm.max_spare_servers之#間調整php-fpm進程數。 pm = dynamic # 靜態方式下開啟的php-fpm進程數量 pm.max_children = 20 # 動態方式下的起始php-fpm進程數量 pm.start_servers = 10 # 動態方式下的最小php-fpm進程數 pm.min_spare_servers = 10 # 動態方式下的最大php-fpm進程數量 pm.max_spare_servers = 20 # php-fpm子進程能處理的最大請求數 pm.max_requests = 1024 pm.process_idle_timeout = 10s request_terminate_timeout = 100 request_slowlog_timeout = 0 slowlog = var/log/slow.log
        • 關于php-fpm 的相關操作

        INT, TERM QUIT 平滑終止 USR1 重新打開日志文件 USR2 平滑重載所有worker進程并重新載入配置和二進制模塊

        啟動: /usr/local/php/sbin/php-fpm查看進程數: ps aux | grep -c php-fpm查看mater進程號:ps aux|grep 'php-fpm: master'|grep -v grep|awk '{print $2}' 或者cat /usr/local/php/var/run/php-fpm.pid

        # 強制關閉 pkill php-fpm  kill -INT `cat /usr/local/php/var/run/php-fpm.pid`  kill -INT [pid]  # 平滑重啟 其實就是通過創建新的進程使 php.ini 生效 kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid` kill -USR2 [pid]
        小結

        至此,php-fpm 算是說完了,其實通過上面的解說,大家也會明白一個問題,為什么lnmp 承受的并發比lamp高,除了nginx的高性能之外,php-fpm 是不是也是其中的一個原因呢?

        推薦學習:《PHP視頻教程》

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 精品少妇一区二区三区在线| 91精品婷婷国产综合久久| 91精品国产高清久久久久久91 | 国产一成人精品福利网站| 狠狠色伊人久久精品综合网| 国产成人AV无码精品| 国产精品乱伦| 午夜国产精品无套| 国产精品视频白浆免费视频| 国产精品日本欧美一区二区 | 国产精品videossex白浆| 国产成人精品综合网站| 99热成人精品免费久久| 国产午夜无码精品免费看| 久久久国产精品网站| 精品91自产拍在线观看二区| 国产成人精品日本亚洲专| 在线观看国产精品普通话对白精品| 精品亚洲aⅴ在线观看| 国产成人精品免高潮在线观看| 国产午夜无码精品免费看 | 久久国产美女免费观看精品 | 2022精品天堂在线视频| 中文精品久久久久国产网址| 国内揄拍高清国内精品对白| 亚洲国产精品国自产拍AV| 国产精品久久久久久搜索| 亚洲精品夜夜夜妓女网| 日批日出水久久亚洲精品tv| 久久99亚洲综合精品首页| 国产精品无码素人福利| 日韩精品一区二区亚洲AV观看| 国产国产成人精品久久| 国产精品无码午夜福利| 欧洲精品99毛片免费高清观看| 久久久91精品国产一区二区三区| 国产中老年妇女精品| 精品国产乱码一区二区三区| 久久精品国产第一区二区三区 | 精品一区二区久久久久久久网站| 6一12呦女精品|