#php-fpm工作流程
php-fpm全名是PHP FastCGI進程管理器
php-fpm啟動後會先讀php.ini,然後再讀對應的conf設定文件,conf配置可以覆寫php.ini的設定。
啟動php-fpm之後,會建立一個master進程,監聽9000埠(可設定),master程序又會根據fpm.conf/www.conf去建立若干子程序,子程序用來處理實際的業務。
當有客戶端(例如nginx)來連接9000埠時,空閒子程序會自己去accept,如果子行程全部處於忙碌狀態,新進的待accept的連線會被master放進佇列裡,等待fpm子程序空閒;
這個存放待accept的半連接的佇列有多長,由 listen.backlog 配置。
相關學習推薦:php程式設計(影片)
#配置裡面的所有相對路徑,都是相對於php的安裝路徑。
除了有php-fpm.conf設定檔外,通常還有其他的*.conf設定檔(也可以不要,直接在php-fpm.conf設定)用來設定進程池,不同的進程池可以用不同的使用者執行,監聽不同的端口,處理不同的任務;多個進程池共用一個全域配置。
include=/opt/remi/php56/root/etc/php-fpm.d/*.conf 載入其他的設定檔。
php-fpm全域設定參數中文說明:
pid = /opt/remi/php56/root/var/run/php-fpm/php-fpm.pid
#pid進程文件,預設為none。error_log = /opt/remi/php56/root/var/log/php-fpm/error.log
#錯誤日誌位置,預設:安裝路徑#INSTALL_PREFIX#/log/php-fpm. log。如果設定為syslog,log就會傳送給syslogd服務而不會寫入檔案裡。syslog.facility = daemon
#把日誌寫進系統log,linux還不夠熟悉,暫時不用理會。syslog.ident = php-fpm
#系統日誌標示,如果跑了多個fpm進程,就需要用這個來區分日誌是誰的。log_level = notice
#日誌等級,預設notice,可選:alert, error, warning, notice, debugemergency_restart_threshold = 60
#配合下面emergency_restart_interval參數emergency_restart_interval = 60s
#如果在此參數設定的時間內,出現SIGSEGV或SIGBUS的子程序數超過emergency_restart_threshold參數設定的值,那麼fpm就會優雅的重啟,值是0表示這個功能值是0表示這個函數,可用的單位有:s秒,m分,h時,d天。process_control_timeout = 0
#設定子程序接受主程序復用訊號的逾時時間。這個每天明白,是過了這個時間就不能重複使用了?process.max = 128
#當動態管理子進程時,fpm最多能fork多少個進程,0表示無限制,這是所有進程池能啟動子進程的總和,謹慎使用。process.priority = -19
#設定子進程的優先權,在master進程以root用戶啟動時有效;如果沒有設置,子進程會繼承master進程的優先權,值範圍- 19(最高)到20(最低),預設不設定。daemonize = yes
#設定成no用於偵錯bug,預設為yes。rlimit_files = 1024
#設定master進程最多能開啟的文件,預設為系統的值。rlimit_core = 0
#master進程核心rlimit限制值;可選unlimited或>=0的整數,預設為系統的值。events.mechanism = epoll
#事件處理機制,預設自動偵測,可選值:select,poll,epoll(linux>=2.5.44),kqueue,/dev/poll,portsystemd_interval = 10s
#當fpm被設定為系統服務時,多久向伺服器報告一次狀態,單位有s,m,h。
php-fpm進程池設定pool Definitions:
在不同的監聽埠和不同的管理選項下可以跑任意數量的池,並沒有個數限制;
池的名字用於logs 和stats。
user = apache
group = apache
##以什麼使用者什麼群組的權限來執行池fpm。
用apache可以像httpd服務一樣去存取某些目錄
listen = 127.0.0.1:9000
#監聽的ip和端口,可以 /path/to/unix/socket來監聽unix socket,效能更好。listen.backlog = 65535
#未accept處理的socket佇列大小,-1 on FreeBSD and OpenBSD,其他平台預設65535,高並發時重要,合理設定會及時處理排隊的請求;太大會積壓太多,處理完後nginx在前面都等超時斷開這個和fpm的socket連接了,就杯具了。不要用-1,建議1024以上,最好是2的冪值。#一個池共用一個backlog佇列,所有的池程序都去這個佇列裡accept連線。
#最大數量受限於系統設定 cat /proc/sys/net/core/somaxconn,系統設定修改:vim /etc/sysctl.conf,增加 net.core.somaxconn = 2000 則最大為2000,然後php最大的backlog可以到2000。
listen.owner = apache
listen.group = apache
listen.mode = 0660
##使用socket連接方式時,指定擁有unix socket權限的用戶,預設和運行的用戶一樣;用tcp連接可以註解掉
listen.allowed_clients = 127.0.0.1
#設定允許連接fpm的位址,例如nginx就要來連,多個位址用逗號隔開,如果不配置,則預設任意位址都能來連。process.priority = -19
#池進程的權限,同樣要master進程是root用戶才有效,和全域那個一樣,不設定的話會繼承master進程的優先權。pm = dynamic
#啟動時子進程管理方式,可選值:static(啟動時建立指定個數), dynamic(啟動時根據情況創建,至少有一個), ondemand(啟動時不創建子進程,有需求才創建)pm.max_children = 5
#該池同時最多存在5個進程, 三種管理方式都要配置#pm. start_servers = 2
#fpm啟動時建立2個子進程,只適用動態dynamic管理方式pm.min_spare_servers = 2
#伺服器閒置時最少保持2個子進程,不夠這個數字就會創建,只適用動態dynamic管理方式pm.max_spare_servers = 3
#伺服器閒置時最多要有幾個,多了會kill,只適用動態dynamic管理方式#pm .process_idle_timeout = 10s
#子進程閒置10s後就會被殺掉。pm.max_requests = 500
#每個子程序最大處理500請求就被回收,可防止記憶體外洩。pm.status_path string
#FPM 狀態頁面的網址。如果沒有設置,則無法存取狀態頁面,預設值:無。
ping.path string
#FPM 監控頁面的 ping 網址。如果沒有設置,則無法存取 ping 頁面。此頁面用於外部檢測 FPM 是否存活並且可以回應請求。請注意必須以斜線開頭(/)。
ping.response string
#用於定義 ping 請求的回傳回應。傳回為 HTTP 200 的 text/plain 格式文字。預設值:pong。process.priority int
#設定 worker 的 nice(2)優先權(如果設定了的話)。該值從 -19(最高優先權) 到 20(較低優先權)。預設值:不設定prefix string
#偵測路徑時使用的前綴access.log = var/log/$pool.access.log
##存取檔案日誌,沒啥用處,例如yii2每次都記錄訪問index.php,只是記錄真實的PHP檔案。slowlog = var/log/$pool.log.slow
#PHP檔案執行過慢的日誌,會準確的記錄具體哪一行程式碼太慢,這個非常有用,在設定了時間時生效。request_slowlog_timeout = 2s
##超過這個運行時間就會寫慢日誌request_terminate_timeout = 3s
##單一請求的逾時時間,有時php.ini設定的最大執行時間未生效,這個就會來幹掉那個執行太久的請求。rlimit_files = 1024
##最大開啟句柄數,預設為系統值。rlimit_core = 0
#最多的核心使用數,預設為系統分配。chroot = /path
#路徑必須是絕對路徑,改變子程序的接目錄,可以把行程對檔案系統的讀寫與實際的作業系統檔案系統隔離,對安全有好處。chdir = /var/www
##改變目前工作目錄,可以用相對路徑,預設是目前目錄或是chroot。
catch_workers_output = yes
#重定向標準輸出stdout和標準錯誤stderr到主錯誤日誌,如果不設置,這兩個日誌就會定向到/dev/null,在高負載情況下,這個配置會造成頁面延遲幾毫秒,預設不開啟。clear_env = no
#建立work進程時是否清除環境變量,如果是yes,那麼該子進程 getenv() 就存取不到 $_ENV 和$_SERVER 了。security.limit_extensions = .php .php3 .php4 .php5
#為了安全,限制能執行的腳本後綴#為目前池指定另外的php.ini 配置,例如指定目前池的錯誤日誌寫在哪個地方
php_value/php_flag
##可以設定php.ini的內容,可以被ini_set覆寫php_admin_value/php_admin_flag
#這個同上,但是不會被ini_set覆蓋。#其中flag設定的,數值只能是on, off, 1, 0, true, false, yes or no,而其他類型的數值則需使用value。
php_flag[display_errors] = off
php_admin_value[error_log] = /var/log/fpm-php.www.log
#php_admin_flag[log_errors] = on
php_admin_flag[log_errors] = on
= on###= on## ###php_admin_value[memory_limit] = 32M####這種方法設定 `disable_functions` 和 `disable_classes` 時,不會覆寫 php.ini 的設置,只會追加。
注意:PHP配置值透過 php_value 或 php_flag 設定,並且會覆寫先前的值。
disable_functions 或 disable_classes 在 php.ini 之中定義的值不會被覆寫掉,但是會將新的設定附加在原有值的後面。
使用 php_admin_value 或 php_admin_flag 定義的值,不能被 PHP 程式碼中的 ini_set() 覆蓋。
自 5.3.3 起,也可以透過 web 伺服器設定 PHP 的設定。
nginx 透過unixsock 與php-fpm 通訊:
適用場景:nginx和php-fpm在同一台伺服器上,這時可以直接用unixsocket進程間通信,不走tcp埠通信,可以節約創建連接的時間,從而提高效能。
1、設定php-fpm的listen為/opt/remi/php56/root/var/run/php-fpm/php567-fpm.sock(可以用相對路徑),然後重啟fpm就會自動建立該php567-fpm.sock檔案
2、nginx的fastcgi_pass參數修改為unix:/opt/remi/php56/root/var/run/php-fpm/php567-fpm.sock; 透過php567- fpm.sock檔案去和fpm通信,需要保證該php567-fpm.sock 檔案nginx 有權限存取。
總結:
sock文件隨便創建到哪裡都可以,只要fpm有權限在那個目錄裡寫文件,nginx有權限去讀就可以。 tcp連接會更穩定,因為有tcp協定保證資料的正確性,但是sock有更少的資料拷貝和上下文切換,更少的資源佔用。不過只能在nginx和fpm在同一台機器上才能用sock。
php-fpm進程狀態監控
#1、nginx設定:遇到status 的請求,直接轉送給php
3、然後重新fpm和nginx,在瀏覽器裡存取就能看到了:location ~^/status$ {
# fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
include
}2、fpm配置:pm.status_path = /status
預設以 text/plain 展示結果,可以傳參數 ?json/html/xml 分別得到json等格式的結果;參數full可以檢視每個子程序的明細
大部分參數只要係統預設的就可以了,我們只需要知道幾個比較重要的參數設置,什麼時候用到可以回頭查詢相關說明
#相關推薦: 程式設計影片課程
以上是php-fpm.conf設定檔中文及重要參數說明的詳細內容。更多資訊請關注PHP中文網其他相關文章!

PHPSession失效的原因包括配置錯誤、Cookie問題和Session過期。 1.配置錯誤:檢查並設置正確的session.save_path。 2.Cookie問題:確保Cookie設置正確。 3.Session過期:調整session.gc_maxlifetime值以延長會話時間。

在PHP中調試會話問題的方法包括:1.檢查會話是否正確啟動;2.驗證會話ID的傳遞;3.檢查會話數據的存儲和讀取;4.查看服務器配置。通過輸出會話ID和數據、查看會話文件內容等方法,可以有效診斷和解決會話相關的問題。

多次調用session_start()會導致警告信息和可能的數據覆蓋。 1)PHP會發出警告,提示session已啟動。 2)可能導致session數據意外覆蓋。 3)使用session_status()檢查session狀態,避免重複調用。

在PHP中配置會話生命週期可以通過設置session.gc_maxlifetime和session.cookie_lifetime來實現。 1)session.gc_maxlifetime控制服務器端會話數據的存活時間,2)session.cookie_lifetime控制客戶端cookie的生命週期,設置為0時cookie在瀏覽器關閉時過期。

使用數據庫存儲會話的主要優勢包括持久性、可擴展性和安全性。 1.持久性:即使服務器重啟,會話數據也能保持不變。 2.可擴展性:適用於分佈式系統,確保會話數據在多服務器間同步。 3.安全性:數據庫提供加密存儲,保護敏感信息。

在PHP中實現自定義會話處理可以通過實現SessionHandlerInterface接口來完成。具體步驟包括:1)創建實現SessionHandlerInterface的類,如CustomSessionHandler;2)重寫接口中的方法(如open,close,read,write,destroy,gc)來定義會話數據的生命週期和存儲方式;3)在PHP腳本中註冊自定義會話處理器並啟動會話。這樣可以將數據存儲在MySQL、Redis等介質中,提升性能、安全性和可擴展性。

SessionID是網絡應用程序中用來跟踪用戶會話狀態的機制。 1.它是一個隨機生成的字符串,用於在用戶與服務器之間的多次交互中保持用戶的身份信息。 2.服務器生成並通過cookie或URL參數發送給客戶端,幫助在用戶的多次請求中識別和關聯這些請求。 3.生成通常使用隨機算法保證唯一性和不可預測性。 4.在實際開發中,可以使用內存數據庫如Redis來存儲session數據,提升性能和安全性。

在無狀態環境如API中管理會話可以通過使用JWT或cookies來實現。 1.JWT適合無狀態和可擴展性,但大數據時體積大。 2.Cookies更傳統且易實現,但需謹慎配置以確保安全性。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

Atom編輯器mac版下載
最受歡迎的的開源編輯器

WebStorm Mac版
好用的JavaScript開發工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能