導航:首頁 > 編程語言 > phpfpm56

phpfpm56

發布時間:2023-07-19 21:51:02

php-fpm設置多少合適

1 那麼,對於我們的伺服器,選擇哪種執行方式比較好呢?事實上,跟Apache一樣,我們運行的PHP程序在執行完成後,或多或少會有內存泄露的問題。這也是為什麼開始的時候一個php-fpm進程只佔用3M左右內存,運行一段時間後就會上升到20-30M的原因了。所以,動態方式因為會結束掉多餘 的進程,可以回收釋放一些內存,所以推薦在內存較少的伺服器或者VPS上使用。具體最大數量根據 內存/20M 得到。比如說512M的VPS,建議pm.max_spare_servers設置為20。至於pm.min_spare_servers,則建議根據伺服器的負載情況來設置,比較合適的值在5~10之間。

2 然後對於比較大內存的伺服器來說,設置為靜態的話會提高效率。因為頻繁開關php-fpm進程也會有時滯,所以內存夠大的情況下開靜態效果會更好。數量也可以根據 內存/30M 得到。比如說2GB內存的伺服器,可以設置為50;4GB內存可以設置為100等

Ⅱ php-fpm的工作機制

概括來說,fpm 的實現就是創建一個 master 進程,在 master 進程中創建並監聽 socket,然後 fork 出多個子進程,這些子進程各自 accept 請求,子進程的處理非常簡單,它在啟動後阻塞在 accept 上,有請求到達後開始讀取請求數據,讀取完成後開始處理然後再返回,在這期間是不會接收其它請求的,也就是說 fpm 的子進程同時只能響應一個請求,只有把這個請求處理完成後才會 accept 下一個請求,這一點與 nginx 的事件驅動有很大的區別,nginx 的子進程通過 epoll 管理套接字,如果一個請求數據還未發送完成則會處理下一個請求,即一個進程會同時連接多個請求,它是非阻塞的模型,只處理活躍的套接字。

fpm 的 master 進程與 worker 進程之間不會直接進行通信,master 通過共享內存獲取 worker 進程的信息,比如 worker 進程當前狀態、已處理請求數等,當 master 進程要殺掉一個 worker 進程時則通過發送信號的方式通知 worker 進程。

fpm 可以同時監聽多個埠,每個埠對應一個 worker pool,而每個 pool 下對應多個 worker 進程,類似 nginx 中 server 概念。

在 php-fpm.conf 中通過[pool name]聲明一個 worker pool:

啟動 fpm 後查看進程:

具體實現上 worker pool 通過fpm_worker_pool_s這個結構表示,多個 worker pool 組成一個單鏈表

接下來看下 fpm 的啟動流程,從main()函數開始:

fpm_init()主要有以下幾個關鍵操作:

(1) fpm_conf_init_main():

解析 php-fpm.conf 配置文件,分配 worker pool 內存結構並保存到全局變數中:fpm_worker_all_pools,各 worker pool 配置解析到fpm_worker_pool_s->config中。

(2)fpm_scoreboard_init_main():

分配用於記錄 worker 進程運行信息的共享內存,按照 worker pool 的最大 worker 進程數分配,每個 worker pool 分配一個fpm_scoreboard_s結構,pool 下對應的每個 worker 進程分配一個fpm_scoreboard_proc_s結構。
(3)fpm_signals_init_main():

這里會通過socketpair()創建一個管道,這個管道並不是用於 master 與 worker 進程通信的,它只在 master 進程中使用,具體用途在稍後介紹 event 事件處理時再作說明。另外設置 master 的信號處理 handler,當 master 收到 SIGTERM、SIGINT、SIGUSR1、SIGUSR2、SIGCHLD、SIGQUIT 這些信號時將調用sig_handler()處理:

(4)fpm_sockets_init_main()

創建每個 worker pool 的 socket 套接字。
(5)fpm_event_init_main():

啟動 master 的事件管理,fpm 實現了一個事件管理器用於管理 IO、定時事件,其中 IO 事件通過 kqueue、epoll、poll、select 等管理,定時事件就是定時器,一定時間後觸發某個事件。

在fpm_init()初始化完成後接下來就是最關鍵的fpm_run()操作了,此環節將 fork 子進程,啟動進程管理器,另外 master 進程將不會再返回,只有各 worker 進程會返回,也就是說fpm_run()之後的操作均是 worker 進程的。

在 fork 後 worker 進程返回了監聽的套接字繼續 main() 後面的處理,而 master 將永遠阻塞在fpm_event_loop(),接下來分別介紹 master、worker 進程的後續操作。

fpm_run()執行後將 fork 出 worker 進程,worker 進程返回main()中繼續向下執行,後面的流程就是 worker 進程不斷 accept 請求,然後執行 PHP 腳本並返回。整體流程如下:

worker 進程一次請求的處理被劃分為 5 個階段:

worker 處理到各個階段時將會把當前階段更新到fpm_scoreboard_proc_s->request_stage,master 進程正是通過這個標識判斷 worker 進程是否空閑的。

接下來我們來看下 master 是如何管理 worker 進程的,首先介紹下三種不同的進程管理方式:

前面介紹到在fpm_run()中 master 進程將進入fpm_event_loop():

這就是 master 整體的處理,其進程管理主要依賴注冊的幾個事件,接下來我們詳細分析下這幾個事件的功能。

(1)sp[1]管道可讀事件:

在 fpm_init() 階段 master 曾創建了一個全雙工的管道:sp,然後在這里創建了一個 sp[0] 可讀的事件,當 sp[0] 可讀時將交由 fpm_got_signal() 處理,向 sp[1] 寫數據時 sp[0] 才會可讀,那麼什麼時機會向 sp[1] 寫數據呢?前面已經提到了:當 master 收到注冊的那幾種信號時會寫入 sp[1] 端,這個時候將觸發 sp[0] 可讀事件。

這個事件是 master 用於處理信號的,我們根據 master 注冊的信號逐個看下不同用途:

具體處理邏輯在 fpm_got_signal() 函數中,這里不再羅列。

(2)fpm_pctl_perform_idle_server_maintenance_heartbeat():

這是進程管理實現的主要事件,master 啟動了一個定時器,每隔 1s 觸發一次,主要用於 dynamic、ondemand 模式下的 worker 管理,master 會定時檢查各 worker pool 的 worker 進程數,通過此定時器實現 worker 數量的控制,處理邏輯如下:

(3)fpm_pctl_heartbeat():

這個事件是用於限制 worker 處理單個請求最大耗時的,php-fpm.conf 中有一個request_terminate_timeout的配置項,如果 worker 處理一個請求的總時長超過了這個值那麼 master 將會向此 worker 進程發送kill -TERM信號殺掉 worker 進程,此配置單位為秒,默認值為 0 表示關閉此機制,另外 fpm 列印的 slow log 也是在這里完成的。

除了上面這幾個事件外還有一個沒有提到,那就是 ondemand 模式下 master 監聽的新請求到達的事件,因為 ondemand 模式下 fpm 啟動時是不會預創建 worker 的,有請求時才會生成子進程,所以請求到達時需要通知 master 進程,這個事件是在fpm_children_create_initial()時注冊的,事件處理函數為fpm_pctl_on_socket_accept(),具體邏輯這里不再展開,比較容易理解。

原文出處: https://www.fanhao.com/2017/10/internal-php-fpm.html

Ⅲ 伺服器程序源代碼分析之二:php-fpm

php作為排名top2 互聯網開發工具,非常流行,可以參考:中國最大的25個網站採用技術選型方案

php這個名稱實際上有兩層含義

直接定義:

php-fpm從php5.3.3開始已經進入到php源代碼包,之前是作為patch存在的

很少人會去讀php本身源代碼,我6年前解決php內存泄露問題的時候做了些研究,最近再查看了一番,發現php的開發者很有誠意,這是一款非常出色的伺服器軟體,支持如下

linux伺服器上,如果不設置 events.mechanism ,那麼默認就是採用epoll,所以

php-fpm的IO模型&並發處理能力和nginx是完全一致

nginx以性能卓越聞名,大部分程序員都認為php效率低下,看了源代碼,才知道這是傳奇啊

在高性能部署的時候,大家往往會針對性的優化nginx 。我自己之前部署php程序也犯了錯誤,8G內存的server,php-fpm的max children都會設置128+,現在看來太多了,參考nginx的部署:

php-fpm配置為 3倍 cpu core number就可以了

php-fpm穩定性比nginx稍差 這是因為php-fpm內置了一個php解析器,php-fpm進程就和php程序捆綁了,如果php腳本寫得不好,有死循環或者阻塞在某個遠端資源上,會拖累載入它的php-fpm進程

而nginx和後端應用伺服器之間通過網路連接,可以設置timeout,不容易堵死的

php-fpm的fastcgi是短連接 我原以為是長連接的,看了代碼才知道也是短連接,處理一個request就關閉掉

php-fpm介面採用fastcgi 非常遺憾,php-fpm和fastcgi完全綁定了,無法獨立使用 。只能部署在支持http-fcgi協議轉換程序背後(nginx)。其實可以考慮在php-fpm代碼包裡面引入http協議支持,這樣php-fpm可以獨立運行,讓nodejs無話可說

php-fpm等同於OpenResty OpenResty是一個國人開發的nginx模塊,就是在nginx引入lua解釋器. 實際上,它和php-fpm的唯一差別就是一個採用php語法,一個用lua,所以OpenResty要作為nginx增強包使用還可以,要選擇它作為一個主要編程工具,沒有任何必要

從架構上來說,php-fpm已經做到最好,超過大多數 python部署工具,我再也不黑它了

Ⅳ cgi、fastcgi、php-cgi、php-fpm異同

1. cgi

    - 通用網關介面,就是外部應用程序(cgi程序)與web伺服器之間的介面標准。

    - nginx是內容分發者,如果是請求index.php,根據配置文件內容得知不是靜態文件,就會去找對應的cgi程序進行解析

    - cgi就是規定要傳那些數據,以什麼格式傳遞給後方進行處理的協議

    - cgi工作模式,一個請求發送過來,啟動cgi解釋器(創建進程)-> 邏輯處理 -> 退出 (fork and exec 模式) 每次都需要重新創建進程,載入配置,浪費系統資源

2. fastcgi

    - 快速通用網關介面,常駐型的cgi,不用每次都fork進程,其會使cgi解解釋器進程常駐內存,所以性能較高

    - master-worker模型,伺服器啟動時載入fastcgi進程管理器

    - fastcgi會進行自身初始化,初始化時會創建多個進程

    - 請求到達web伺服器後,fastcgi進程管理器會選擇並通過socket連接到一個cgi解釋器

3. php-cgi

    - php自帶的cgi管理器

    - php-cgi的缺點,不能平滑重啟,需要重啟php-cgi才能使php.ini生效

4. php-fpm

    - php-fpm是php的一種fastcgi的實現,管理php的fastcgi進程池

    - 能夠調度php-cgi程序

    - 能夠實現平滑重啟

    - php-fpm創建一個master進程,然後創建進程池,監聽socket,fork出多個子進程,子進程各自accept請求,php-fpm的子進程同時只能響應一個請求,處理完一個請求才可以accept下一個請求,多進程,同步阻塞模型

    - master和worker進程之間不直接進行通信,master通過共享內存獲取worker進程信息,master進程發送信號通知worker進程

    - php-fpm可以同時監聽多個埠,每個埠對應一個worker pool

    - worker是cgi程序,php-fpm是fastcgi協議的php是實現

Ⅳ mac配置php-fpm,nginx運行多版本php

1、brew 安裝 php5.6 php5.7 nginx

2、配置php-conf

3、配置虛擬主機

安裝好brew

用brew 命令安裝,如果速度太慢或訪問不了,自行goole brew 換源

brew search php  查看可用的php版本

brew install [email protected]  安裝php5.6

brew install [email protected] 安裝php5.6

brew install nginx       安裝nginx

1、修改php5.6 php-fpm的埠為9056

    cd usr/local/etc/php/5.6 # 到php5.6的目錄下

    vi    php-fpm.conf # 修改文件

        listen = 127.0.0.1:9056  # 修改此埠

        daemonize = yes # 修改為允許後台啟動php-fpm

2、修改php5.6 php-fpm的埠為9070

    cd /usr/local/etc/php/7.1/php-fpm.d # 到php7.1的目錄下

    vi www.conf # 修改埠

        listen = 127.0.0.1:9056  # 修改此埠    

    vi    php-fpm.conf  # 修改文件

         daemonize = yes # 修改為允許後台啟動php-fpm

3、啟動php-fpm

    cd /usr/local/sbin # 到此目錄,建立兩個軟鏈接指向不同版本的php

切換到root用戶

./php-fpm56 

./php-fpm71

啟動後可看到php-fpm的進程,則成功

ps-ef | grep php-fpm

cd /usr/local/etc/nginx/  # 到nginx的目錄下

復制默認的配置文件到server下(此目錄用來存虛擬主機文件)

這里我在server創建了這兩個

vi local.phpinfo56.com.conf # 修改本地域名和nginx代理到php-fpm埠,按照這種方法修改另一個

nginx # 啟動nginx

nginx -s reload # 修改配置文件,重新載入nginx

vi /etc /hosts  # 修改host 加上映射關系

cd  /usr /local/var/www # 在此目錄下建立一個index.php

echo "<?php phpinfo();" > index.php

在瀏覽器訪問可看到

Ⅵ 如何用php-fpm 執行php程序

第一步:確定php-fpm配置文件的路徑,執行:
ps -aux | grep php-fpm

圖中,我的是在 /soft/php7/etc/ 目錄,在這個目錄下有個php-fpm.d目錄,打開這個目錄後,找到www.conf文件,修改該文件里:
user = www
group = www

Ⅶ 了解PHP-FPM

在伺服器上,當我們查看php進程時,全都是php-fpm進程,大家都知道這個就是php的運行環境,那麼,它到底是個什麼東西呢?

PHP-FPM,就是PHP的FastCGI管理器,用於替換PHP FastCGI的大部分附加功能,在PHP5.3.3後已經成為了PHP的標配。

有小夥伴要問了,FastCGI又是什麼鬼?CGI程序又叫做「通用網關介面」,就是讓Web伺服器和你的應用程序進行交互的一個介面。就像nginx中需要配置的fastcgi_pass,一般我們會使用127.0.0.1:9000或者unix:/tmp/php-cgi.sock來配置這個參數。它的意思就是告訴nginx,過來的請求使用tcp:9000埠的監聽程序來處理或者使用unix/socket來處理。它們都是指向的PHP運行程序。

再說得通俗一點,我們運行php腳本用的是

php-fpm就相當於是這個php命令。nginx通過fastcgi_pass來運行php $nginx_root(nginx配置文件中網站根目錄root配置)下的index.php。所以,如果你用的是python或者其他什麼語言,都可以用它們的cgi程序來讓nginx調用。

FastCGI和CGI又有什麼不同呢?FastCGI是啟動一個socket介面,伺服器應用不需要自己去運行php,只需要向這個socket介面提交請求就可以了。

php-fpm在編譯php時需要添加--enable-fpm。一些通用的集成安裝包如lnmp、phpStudy等都會默認編譯並使用php-fpm,畢竟是標配。

上文中說過nginx可以使用127.0.0.1:9000和unix:/tmp/php-cgi.sock這兩種方式來調用php-fpm。它們有什麼區別呢?

前者,一般帶9000埠號的,是tcp形式的調用。也就是php-fpm啟動了一個監聽進程對9000埠進行監聽。它會調起一個tcp/ip服務,nginx在調用的時候會走一次tcp請求流程,也就是3次握手4次揮手,會走到網路七層中的第四層傳輸層。相對來說這種方式性能會稍差一點,啟動php-fpm後使用nestat查看埠中會出現9000埠的佔用。

後者,使用的是unix套接字socket服務,通過sock文件來交換信息,性能相對好一些,因為它沒有tcp連接過程,也不會有9000埠的佔用。

對於高負載大訪問量的網站還是推薦使用unix方式,對於普通小網站來說,無所謂使用哪個都可以,tcp方式反而更容易配置和理解,也是php-fpm.conf中默認的監聽方式。

php-fpm.conf配置中的listen屬性用來配置監聽,這里的配置要和nginx中的一致,使用tcp的就監聽127.0.0.1:9000,使用unix的就設置成/tmp/php-cgi-56.sock。

以下內容摘自官方文檔:

===========

各自媒體平台均可搜索【硬核項目經理】

閱讀全文

與phpfpm56相關的資料

熱點內容
我的世界命令方塊傳送指令 瀏覽:545
不能用start命令打開xp 瀏覽:925
text命令 瀏覽:30
為什麼appstore經常下架游戲 瀏覽:91
java管理信息系統 瀏覽:16
ipadpro登錄雲伺服器 瀏覽:62
沒加密招標文件 瀏覽:261
命令來自剃頭的用英語怎麼說 瀏覽:767
什麼app不花一分錢買東西 瀏覽:375
布林四線指標源碼 瀏覽:970
單片機的控制板 瀏覽:220
襄陽軟體編程 瀏覽:843
sshpass命令 瀏覽:108
logo伺服器怎麼下載 瀏覽:510
如何ftp連接伺服器 瀏覽:676
creo自動編程 瀏覽:163
雲伺服器在電腦怎麼開 瀏覽:434
ipad相冊如何在文件夾中建文件夾 瀏覽:623
和家親這個app有什麼用 瀏覽:577
什麼app裡面有種樹打折 瀏覽:374