深入去了解下PHP FPM,你會變得更強

2021-09-28 19:51:16 字數 3614 閱讀 5192

php-fpm(php fastcgi process manager)意:php fastcgi 程序管理器,用於管理php 程序池的軟體,用於接受web伺服器的請求。

php-fpm提供了更好的php程序管理方式,可以有效控制記憶體和程序、可以平滑過載php配置。

(1). 為什麼會出現php-fpm

fpm的出現全部因為php-fastcgi出現。為了很好的管理php-fastcgi而實現的乙個程式

(2). 什麼是php-fastcgi

php-fastcgi 只是乙個cgi程式,只會解析php請求,並且返回結果,不會管理(因此才出現的php-fpm)。

(3)為什麼不叫php-cgi

其實在php-fastcgi出現之前是有乙個php-cgi存在的,只是它的執行效率低下,因此被php-fastcgi取代。

(4)那fastcgi和cgi有什麼區別呢?

親們,這區別就大了,當乙個服務web-server(nginx)分發過來請求的時候,通過匹配字尾知道該請求是個動態的php請求,會把這個請求轉給php。

在cgi的年代,思想比較保守,總是乙個請求過來後,去讀取php.ini裡的基礎配置資訊,初始化執行環境,每次都要不停的去建立乙個程序,讀取配置,初始化環境,返回資料,退出程序,久而久之,啟動程序的工作變的乏味無趣特別累。

當php來到了5的時代,大家對這種工作方式特別反感,想偷懶的人就拼命的想,我可不可以讓cgi一次啟動乙個主程序(master),讓他只讀取一次配置,然後在啟動多個工作程序(worker),當乙個請求來的時候,通過master傳遞給worker這樣就可以避免重複勞動了。於是就產生了fastcgi。

(5)fastcgi這麼好,啟動的worker用完怎麼辦?

當worker不夠的時候,master會通過配置裡的資訊,動態啟動worker,等空閒的時候可以收回worker

(6)到現在還是沒明白php-fpm 是個什麼東西?

就是來管理啟動乙個master程序和多個worker程序的程式.

php-fpm 會建立乙個主程序,控制何時以及如何將http請求**給乙個或多個子程序處理。php-fpm主程序還控制著什

麼時候建立(處理web應用更多的流量)和銷毀(子程序執行時間太久或不再需要了)

php子程序。php-fpm程序池中的每個程序存在的時間都比單個http請求長,可以處

理10、50、100、500或更多的http請求。

在centos中,php-fpm 的主配置檔案是 /etc/php7/php-fpm.conf。

指定一段時間內有指定個子程序失效了,php-fpm重啟:

#在指定的一段時間內,如果失效的php-fpm子程序數超過這個值,php-fpm主程序將優雅重啟。

emergency_restart_threshold = 10

#設定emergency_restart_interval 設定採用的時間跨度。

emergency_restart_interval = 1m

配置程序池

php-fpm配置檔案其餘的內容是乙個名為pool defintions的區域。這個區域裡的配置使用者設定每個php-fpm程序池。php-fpm程序池中是一系列相關的php子程序。==通常乙個php應用有自己乙個程序池==。

centos在php-fpm主配置檔案的頂部引入程序池定義檔案:

include=/etc/php7/php-fpm.d/*.conf
www.conf 是php-fpm程序池的預設配置檔案。

user= nobody

#擁有這個 php-fpm程序池中子程序的系統使用者。要把這個設定的值設用的非根使用者的使用者名稱。

group = nobody

#擁有這個 php-fpm程序池中子程序的系統使用者組。要把這個設定的值設應用的非根使用者所屬的使用者組名。

listen=[::]]:9000

#php-fpm程序池監聽的ip位址和埠號,讓 php-fpm只接受 nginx從這裡傳入的請求。

listen. allowed clients =127.0.0.1

#可以向這個 php-fpm程序池傳送請求的ip位址(乙個或多個)。

pm.max children =51

#這個設定設定任何時間點 php-fpm程序池中最多能有多少個程序。這個設定沒有絕對正確的值,你應該測試你的php應用,確定每個php程序需要使用多少記憶體,然後把這個設定設為裝置可用記憶體能容納的php程序總數。對大多數中小型php應用來說,每個php程序要使用5~15mb記憶體(具體用量可能有差異)。假設我們使用裝置為這個php-fpm程序池分配了512mb可用記憶體,那麼可以把這個設定設為(512mb總記憶體)/(每個程序使用10mb) = 51個程序。

...

sudo systemctl restart php-fpm.service
php-fpm程序池的配置詳情參見 

測試環境的配置如下:

[www]

user = nobody               #程序的發起使用者和使用者組,使用者user是必須設定,group不是  nobody 任意使用者

group = nobody

listen = [::]:9000          #監聽ip和埠,[::] 代表任意ip

pm = dynamic                #選擇程序池管理器如何控制子程序的數量  static:  對於子程序的開啟數路給定乙個鎖定的值(pm.max_children)   dynamic:  子程序的數目為動態的,它的數目基於下面的指令的值(以下為dynamic適用引數)

pm.max_children = 16        #同一時刻能夠存貨的最大子程序的數量

pm.start_servers = 4        #在啟動時啟動的子程序數量

pm.min_spare_servers = 2    #處於空閒"idle"狀態的最小子程序,如果空閒程序數量小於這個值,那麼相應的子程序會被建立

pm.max_spare_servers = 16   #最大空閒子程序數量,空閒子程序數量超過這個值,那麼相應的子程序會被殺掉。

catch_workers_output = yes  #將worker的標準輸出和錯誤輸出重定向到主要的錯誤日誌記錄中,如果沒有設定,根據fastcgi的指定,將會被重定向到/dev/null上

生產環境配置:

nginx為例:

server 

location / 

#把http請求**給php-fpm程序池處理

location ~ .*\.php                 include fastcgi_params;

fastcgi_param script_filename $document_root$fastcgi_script_name;

fastcgi_pass   192.168.33.30:9000;      #監聽9000埠

fastcgi_index  index.php;

try_files $uri =404;

#include fastcgi.conf;

}location ~ /\.(ht|svn|git) 

}

了解下C 變數

乙個變數只不過是乙個供程式操作的儲存區的名字。在 c 中,每個變數都有乙個特定的型別,型別決定了變數的記憶體大小和布局。範圍內的值可以儲存在記憶體中,可以對變數進行一系列操作。我們已經討論了各種資料型別。c 中提供的基本的值型別大致可以分為以下幾類 型別舉例 整數型別 sbyte byte shor...

帶大家了解下margin

1.margin是 外邊距 2.margin 當兩個垂直外邊距相遇時,它們將形成乙個外邊距。合併後的外邊距的高度等於兩個發生合併的外邊距的高度中的較大者.margin左右不合併 3.如果margin有三個值,第乙個值表示上margin值,第二個值表示左右margin的值 4.何時應當使用margin...

路由器了解下?

簡單來說,就是能夠進行路由和 的裝置,把成千上萬的網路連線起來的裝置 定義 是一種實現網路互聯的裝置,三層裝置,提供路由與 兩種重要機制 可以決定資料報從 端到目的端所經過的路由路徑 host到host之間的最佳傳輸路徑 這個過程稱為路由 將路由器輸入端的資料報 移送至適當的路由器輸出端 在路由器內...