什麼是php-fpm?以下這篇帶大家了解一下php-fpm,介紹一下優(yōu)化 php-fpm 時我們到底要優(yōu)化什麼,希望對大家有幫助!
什麼是php-fpm?如何進行優(yōu)化來提升效能?是無所不在的,可以說是網(wǎng)路 Web 應用上使用最廣泛的語言。
然而,它的高效能並不為人所知,尤其是在涉及高並發(fā)系統(tǒng)時。這就是為什麼對於這樣特殊的用例,正在被 Node (是的,我知道,它不是一種語言)、Go 和 Elixir 等語言接管。
也就是說,您可以做很多事情來改進伺服器上的 什麼是php-fpm?如何進行優(yōu)化來提升效能? 效能。本文主要關注 php-fpm
方面的內容,如果您使用Nginx,這是在伺服器上的預設配置。
如果你知道 php-fpm
是什麼,請直接跳到最佳化部分。
什麼是php-fpm?
許多開發(fā)人員對DevOps 方面的知識不太感興趣,即使是那些對此感興趣的開發(fā)人員,也極少有人知道它的底層原理。有趣的是,當瀏覽器發(fā)送一個請求到運行 什麼是php-fpm?如何進行優(yōu)化來提升效能? 的伺服器上時,什麼是php-fpm?如何進行優(yōu)化來提升效能? 也不是最先進行處理請求的服務;而是,HTTP 伺服器,Apache 和 Nginx 是其中最主要的兩個。 「web 伺服器」決定如何與 什麼是php-fpm?如何進行優(yōu)化來提升效能? 進行通信,然後傳遞請求的類型,資料和頭部資訊到 什麼是php-fpm?如何進行優(yōu)化來提升效能? 進程。
上圖是什麼是php-fpm?如何進行優(yōu)化來提升效能? 專案的請求-回應生命週期(圖片來源: ProinerTech)
在現(xiàn)代什麼是php-fpm?如何進行優(yōu)化來提升效能? 應用中,「find file」部分即為index.php
文件,它是在伺服器設定檔中配置的用於處理所有請求的代理。
如今,Web 伺服器究竟如何連接 什麼是php-fpm?如何進行優(yōu)化來提升效能? 正在進化,如果我們要深入研究所有細節(jié),這篇文章的長度將會激增。但粗略來說, 在 Apache 作為 Web 伺服器首選的時間段,什麼是php-fpm?如何進行優(yōu)化來提升效能? 是作為包含在伺服器內部的模組。
所以每當一個請求被接收,伺服器將開啟一個新的進程, 它將自動包含 什麼是php-fpm?如何進行優(yōu)化來提升效能? 和執(zhí)行請求。這個方法被稱為mod_php
,「什麼是php-fpm?如何進行優(yōu)化來提升效能?作為一個模組」的縮寫。這種方法有其局限性,而 Nginx 和 php-fpm
克服了它。
在php-fpm
中,管理 什麼是php-fpm?如何進行優(yōu)化來提升效能? 的責任在於伺服器內部的 什麼是php-fpm?如何進行優(yōu)化來提升效能? 程式。換言之, Web 伺服器 (Nginx, 在本例中), 不在乎 什麼是php-fpm?如何進行優(yōu)化來提升效能? 在哪和怎樣運行的,只要它知道如何發(fā)送和接收資料即可。如果需要,在這種情況下,您可以將什麼是php-fpm?如何進行優(yōu)化來提升效能?視為另一臺伺服器,它管理傳入請求的某些子什麼是php-fpm?如何進行優(yōu)化來提升效能?進程(因此,我們將請求送到伺服器,該請求由伺服器接收並傳遞到伺服器— —太瘋狂了!:-P)。
如果你用過Nginx
,你會看到這些程式碼:
?????location?~?\.php$?{ ????????try_files?$uri?=404; ????????fastcgi_split_path_info?^(.+\.php)(/.+)$; ????????fastcgi_pass?unix:/run/php/php7.2-fpm.sock; ????????fastcgi_index?index.php; ????????include?fastcgi_params; ????????fastcgi_param??SCRIPT_FILENAME?$document_root$fastcgi_script_name; ????}
對於這一行:fastcgi_pass unix:/run/php/php7.2 -fpm.sock;
,它告訴Nginx透過?php7.2-fpm.sock
的socket
與php進程通訊。因此,對於每個傳入的請求,Nginx都透過這個檔案寫入數(shù)據(jù),在接收輸出後,將其發(fā)送回瀏覽器。
我必須再次強調,對於如何運行這不是最完整或最準確的,但對於大多數(shù) DevOps 任務是完全準確的。
除此之外,讓我們回顧一下到目前為止所學到的東西:
- 什麼是php-fpm?如何進行優(yōu)化來提升效能?不會直接接收瀏覽器發(fā)送的請求。像 Nginx 這種 Web 伺服器會先攔截它。
- Web 伺服器知道如何連接到什麼是php-fpm?如何進行優(yōu)化來提升效能?進程,並將所有請求資料(貼上所有內容)傳遞到 什麼是php-fpm?如何進行優(yōu)化來提升效能? 上。
- 什麼是php-fpm?如何進行優(yōu)化來提升效能? 完成其職責後,會將回應傳送回 Web 伺服器,然後將其傳送回客戶端(在大多數(shù)情況下為瀏覽器)。
流程圖如下:
什麼是php-fpm?如何進行優(yōu)化來提升效能? 和 Nginx 如何協(xié)同工作? (圖片來源:資料狗)
到目前為止都不錯, 那麼關鍵問題來了:什麼是php-fpm?如何進行優(yōu)化來提升效能?-FPM到底是什麼呢?
什麼是php-fpm?如何進行優(yōu)化來提升效能? 中的FPM
代表「快速進程管理器」, ?花式解釋就是說,在伺服器上運行的什麼是php-fpm?如何進行優(yōu)化來提升效能? 並不是單一進程,而是由這個FPM 進程管理器派生、控制和終止的一些什麼是php-fpm?如何進行優(yōu)化來提升效能? 進程。 web伺服器將請求傳遞給的就是這個進程管理器。
什麼是php-fpm?如何進行優(yōu)化來提升效能?-FPM 本身就是一個完整的兔子洞,所以如果您願意,可以隨意探索,但是對於我們的目的,這些解釋就足夠啦。 ?
為什麼要最佳化php-fpm?
一般在正常運作的情況下,為什麼要考慮最佳化呢?為什麼不將事物保持原樣。
具有諷刺意味的是,一般我為大多數(shù)用例提供建議的話。 如果您的設置運行良好,并且沒有特殊用例,請使用默認設置。 但是,如果您希望擴展一臺機器之外的能力,那么從一臺機器中擠出最大的處理能力是必不可少的,因為它可以將您服務器的花費減少一半(甚至更多?。?。
要說明的另一件事情是,Nginx是為處理巨大的工作負載而構建的。 它能夠同時處理成千上萬的連接,但是如果您的什麼是php-fpm?如何進行優(yōu)化來提升效能?設置不合理,那么您將浪費很多資源,因為Nginx必須等待什麼是php-fpm?如何進行優(yōu)化來提升效能?完成當前處理之后才可以接受下一個請求,最終Nginx不能為您的服務提供任何優(yōu)勢!
所以,接下來讓我們看看嘗試優(yōu)化 php-fpm
時我們到底要優(yōu)化什么。
如何優(yōu)化 什麼是php-fpm?如何進行優(yōu)化來提升效能?-FPM ?
php-fpm
的配置文件在不同服務器上的位置可能不同,因此您需要做一些調查來確定它的位置。在 UNIX 上,你可以使用 find 命令。在我的 Ubuntu 上,它的路徑是 /etc/php/7.2/fpm/php-fpm.conf
。當然,7.2是我正在運行的 什麼是php-fpm?如何進行優(yōu)化來提升效能? 版本。
下面是這個文件的前幾行代碼:
;;;;;;;;;;;;;;;;;;;;; ;?FPM?Configuration?; ;;;;;;;;;;;;;;;;;;;;; ;?All?relative?paths?in?this?configuration?file?are?relative?to?什麼是php-fpm?如何進行優(yōu)化來提升效能?'s?install ;?prefix?(/usr).?This?prefix?can?be?dynamically?changed?by?using?the ;?'-p'?argument?from?the?command?line. ;;;;;;;;;;;;;;;;;; ;?Global?Options?; ;;;;;;;;;;;;;;;;;; [global] ;?Pid?file ;?Note:?the?default?prefix?is?/var ;?Default?Value:?none pid?=?/run/php/php7.2-fpm.pid ;?Error?log?file ;?If?it's?set?to?"syslog",?log?is?sent?to?syslogd?instead?of?being?written ;?into?a?local?file. ;?Note:?the?default?prefix?is?/var ;?Default?Value:?log/php-fpm.log error_log?=?/var/log/php7.2-fpm.log
很明顯:這一行 pid = /run/php/php7.2-fpm.pid
告訴我們哪個文件包含了 php-fpm
進程的進程 id。
我們還看到 /var/log/php7.2-fpm.log
是 php-fpm
存儲日志的地方。
在這個文件中,像下面這樣添加三個變量:
emergency_restart_threshold?10 emergency_restart_interval?1m process_control_timeout?10s
前兩個設置是警告性的,它們告訴 php-fpm
進程,如果10個子進程在一分鐘內失敗,主 php-fpm
進程應該重新啟動自己。
這聽起來可能不夠穩(wěn)健,但是 什麼是php-fpm?如何進行優(yōu)化來提升效能? 是一個短暫的進程,它會泄漏內存,所以在出現(xiàn)高故障時重新啟動主進程可以解決很多問題。
第三個選項是 process_control_timeout
,它告訴子進程在執(zhí)行從父進程接收到的信號之前需要等待這么長的時間。這個設置是非常有用的。例如,當父進程發(fā)送終止信號時,子進程正在處理某些事情的時候。十秒的時間,他們會有一個更好的機會完成任務并且優(yōu)雅地退出。
令人驚訝的是,這 不是 php-fpm 的核心配置!這是因為,為了 web 請求服務,php-fpm
創(chuàng)建了一個新的進程池,它將具有一個單獨的配置。在我的例子中,進程池的名稱是 www
,我想編輯的文件是 /etc/php/7.2/fpm/pool.d/www.conf
。
讓我們來看看文件的內容:
;?Start?a?new?pool?named?'www'. ;?the?variable?$pool?can?be?used?in?any?directive?and?will?be?replaced?by?the ;?pool?name?('www'?here) [www] ;?Per?pool?prefix ;?It?only?applies?on?the?following?directives: ;?-?'access.log' ;?-?'slowlog' ;?-?'listen'?(unixsocket) ;?-?'chroot' ;?-?'chdir' ;?-?'php_values' ;?-?'php_admin_values' ;?When?not?set,?the?global?prefix?(or?/usr)?applies?instead. ;?Note:?This?directive?can?also?be?relative?to?the?global?prefix. ;?Default?Value:?none ;prefix?=?/path/to/pools/$pool ;?Unix?user/group?of?processes ;?Note:?The?user?is?mandatory.?If?the?group?is?not?set,?the?default?user's?group ;???????will?be?used. user?=?www-data group?=?www-data
快速瀏覽一下上面代碼片段的末尾,您就會明白為什么服務器進程以 www-data
的形式運行了。如果您在設置網(wǎng)站時遇到文件權限問題,您可能要將目錄的所有者或組更改為 www-data
,從而允許什麼是php-fpm?如何進行優(yōu)化來提升效能?進程寫入日志文件和上傳文檔等。
最后,我們到達了問題的根源,流程管理器 (pm) 設置。一般情況下,默認值是這樣的:
pm?=?dynamic pm.max_children?=?5 pm.start_servers?=?3 pm.min_spare_servers?=?2 pm.max_spare_servers?=?4 pm.max_requests?=?200
那么,這里的 「dynamic(動態(tài))」是什么意思呢?我認為官方文檔最好地解釋了這一點(我的意思是,這應該已經(jīng)是您正在編輯的文件的一部分,但是我在這里復制了它,以防它不是):
;?Choose?how?the?process?manager?will?control?the?number?of?child?processes. ;?Possible?Values: ;???static??-?a?fixed?number?(pm.max_children)?of?child?processes; ;???dynamic?-?the?number?of?child?processes?are?set?dynamically?based?on?the ;?????????????following?directives.?With?this?process?management,?there?will?be ;?????????????always?at?least?1?children. ;?????????????pm.max_children??????-?the?maximum?number?of?children?that?can ;????????????????????????????????????be?alive?at?the?same?time. ;?????????????pm.start_servers?????-?the?number?of?children?created?on?startup. ;?????????????pm.min_spare_servers?-?the?minimum?number?of?children?in?'idle' ;????????????????????????????????????state?(waiting?to?process).?If?the?number ;????????????????????????????????????of?'idle'?processes?is?less?than?this ;????????????????????????????????????number?then?some?children?will?be?created. ;?????????????pm.max_spare_servers?-?the?maximum?number?of?children?in?'idle' ;????????????????????????????????????state?(waiting?to?process).?If?the?number ;????????????????????????????????????of?'idle'?processes?is?greater?than?this ;????????????????????????????????????number?then?some?children?will?be?killed. ;??ondemand?-?no?children?are?created?at?startup.?Children?will?be?forked?when ;?????????????new?requests?will?connect.?The?following?parameter?are?used: ;?????????????pm.max_children???????????-?the?maximum?number?of?children?that ;?????????????????????????????????????????can?be?alive?at?the?same?time. ;?????????????pm.process_idle_timeout???-?The?number?of?seconds?after?which ;?????????????????????????????????????????an?idle?process?will?be?killed. ;?Note:?This?value?is?mandatory.
由此可見,有三個可用值:
- Static: 無論什么情況,都會保持一個固定的什麼是php-fpm?如何進行優(yōu)化來提升效能?進程數(shù)量。
-
Dynamic: 我們需要指定
php-fpm
在任何給定時間點會保持活動的最小以及最大進程數(shù)量。 - ondemand: 按照需求創(chuàng)建和銷毀進程。
那這些設置有什么影響呢?
簡而言之,如果你有個小流量的網(wǎng)站,“dynamic”設置在大多數(shù)時間內都是一種資源的浪費。假設你的pm.min_spare_servers
設置成了3,那會有三個什麼是php-fpm?如何進行優(yōu)化來提升效能?進程會被創(chuàng)建并保持運行,甚至是網(wǎng)站沒有流量時。這種情況下,“ondemand” 就是個更好的選擇, 可以讓系統(tǒng)決定何時啟動新的進程。
另一方面, 大流量 或者必須快速響應的網(wǎng)站將在這種情況下被懲罰。 最好避免創(chuàng)建新的 什麼是php-fpm?如何進行優(yōu)化來提升效能? 進程的額外開銷,使其成為池的一部分并對其進行監(jiān)控。
使用?pm = static
?固定子進程的數(shù)量,使最大的系統(tǒng)資源用于服務請求而不是管理 什麼是php-fpm?如何進行優(yōu)化來提升效能?。假如你確定走這條路,注意它有其指導方針和陷阱.關于它的一篇相當密集但非常有用的文章是?這篇 。
寫在最后
由于有關網(wǎng)絡性能的文章可能會引發(fā)爭論或使人們感到困惑,因此在結束本文之前,我覺得需要講幾句話。 性能調優(yōu)既涉及系統(tǒng)知識,也涉及猜測和技巧。
即使您完全了解 php-fpm
的所有設置,也無法保證成功。如果您不了解 php-fpm
的存在,那麼您就不必浪費時間擔心它。繼續(xù)做您已經(jīng)在做的事情並繼續(xù)下去。
同時,盡可能不讓結果變得很戲劇性。是的,您可以透過從頭開始重新編譯 什麼是php-fpm?如何進行優(yōu)化來提升效能? 並刪除所有不需要的模組來獲得更好的效能,但這種方法在生產(chǎn)環(huán)境中不夠明智。優(yōu)化某些內容的整個想法是查看您的需求是否與預設值不同(它們很少這樣做?。瑏K根據(jù)需要進行較小的更改。
原文網(wǎng)址:https://geekflare.com/php-fpm-optimization/
翻譯網(wǎng)址:https://learnku.com/php/t/34358
推薦:《什麼是php-fpm?如何進行優(yōu)化來提升效能?影片教學》
以上是什麼是php-fpm?如何進行優(yōu)化來提升效能?的詳細內容。更多資訊請關注PHP中文網(wǎng)其他相關文章!

熱AI工具

Undress AI Tool
免費脫衣圖片

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

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

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

在PHP中搭建社交分享功能的核心方法是通過動態(tài)生成符合各平臺要求的分享鏈接。 1.首先獲取當前頁面或指定的URL及文章信息;2.使用urlencode對參數(shù)進行編碼;3.根據(jù)各平臺協(xié)議拼接生成分享鏈接;4.在前端展示鏈接供用戶點擊分享;5.動態(tài)生成頁面OG標籤優(yōu)化分享內容展示;6.務必對用戶輸入進行轉義以防止XSS攻擊。該方法無需複雜認證,維護成本低,適用於大多數(shù)內容分享需求。

1.評論系統(tǒng)商業(yè)價值最大化需結合原生廣告精準投放、用戶付費增值服務(如上傳圖片、評論置頂)、基於評論質量的影響力激勵機制及合規(guī)匿名數(shù)據(jù)洞察變現(xiàn);2.審核策略應採用前置審核 動態(tài)關鍵詞過濾 用戶舉報機制組合,輔以評論質量評分實現(xiàn)內容分級曝光;3.防刷需構建多層防禦:reCAPTCHAv3無感驗證、Honeypot蜜罐字段識別機器人、IP與時間戳頻率限制阻止灌水、內容模式識別標記可疑評論,持續(xù)迭代應對攻擊。

要實現(xiàn)PHP結合AI進行文本糾錯與語法優(yōu)化,需按以下步驟操作:1.選擇適合的AI模型或API,如百度、騰訊API或開源NLP庫;2.通過PHP的curl或Guzzle調用API並處理返回結果;3.在應用中展示糾錯信息並允許用戶選擇是否採納;4.使用php-l和PHP_CodeSniffer進行語法檢測與代碼優(yōu)化;5.持續(xù)收集反饋並更新模型或規(guī)則以提升效果。選擇AIAPI時應重點評估準確率、響應速度、價格及對PHP的支持。代碼優(yōu)化應遵循PSR規(guī)範、合理使用緩存、避免循環(huán)查詢、定期審查代碼,並藉助X

用戶語音輸入通過前端JavaScript的MediaRecorderAPI捕獲並發(fā)送至PHP後端;2.PHP將音頻保存為臨時文件後調用STTAPI(如Google或百度語音識別)轉換為文本;3.PHP將文本發(fā)送至AI服務(如OpenAIGPT)獲取智能回復;4.PHP再調用TTSAPI(如百度或Google語音合成)將回復轉為語音文件;5.PHP將語音文件流式返回前端播放,完成交互。整個流程由PHP主導數(shù)據(jù)流轉與錯誤處理,確保各環(huán)節(jié)無縫銜接。

PHP不直接進行AI圖像處理,而是通過API集成,因為它擅長Web開發(fā)而非計算密集型任務,API集成能實現(xiàn)專業(yè)分工、降低成本、提升效率;2.整合關鍵技術包括使用Guzzle或cURL發(fā)送HTTP請求、JSON數(shù)據(jù)編解碼、API密鑰安全認證、異步隊列處理耗時任務、健壯錯誤處理與重試機制、圖像存儲與展示;3.常見挑戰(zhàn)有API成本失控、生成結果不可控、用戶體驗差、安全風險和數(shù)據(jù)管理難,應對策略分別為設置用戶配額與緩存、提供prompt指導與多圖選擇、異步通知與進度提示、密鑰環(huán)境變量存儲與內容審核、雲(yún)存

PHP通過數(shù)據(jù)庫事務與FORUPDATE行鎖確保庫存扣減原子性,防止高並發(fā)超賣;2.多平臺庫存一致性需依賴中心化管理與事件驅動同步,結合API/Webhook通知及消息隊列保障數(shù)據(jù)可靠傳遞;3.報警機制應分場景設置低庫存、零/負庫存、滯銷、補貨週期和異常波動策略,並按緊急程度選擇釘釘、短信或郵件通知責任人,且報警信息需完整明確,以實現(xiàn)業(yè)務適配與快速響應。

PHP通過收集用戶數(shù)據(jù)(如瀏覽歷史、地理位置)並預處理,為AI模型提供輸入基礎;2.使用curl或gRPC等技術對接AI模型,獲取點擊率、轉化率預測結果;3.根據(jù)預測動態(tài)調整廣告展示頻率、目標人群等策略;4.通過A/B測試不同廣告變體並記錄數(shù)據(jù),結合統(tǒng)計分析優(yōu)化效果;5.利用PHP監(jiān)控流量來源、用戶行為並與GoogleAds等第三方API集成,實現(xiàn)自動化投放與持續(xù)反饋優(yōu)化,最終提升CTR、CVR並降低CPC,完整實現(xiàn)AI驅動的廣告系統(tǒng)閉環(huán)。

PHPisstillrelevantinmodernenterpriseenvironments.1.ModernPHP(7.xand8.x)offersperformancegains,stricttyping,JITcompilation,andmodernsyntax,makingitsuitableforlarge-scaleapplications.2.PHPintegrateseffectivelyinhybridarchitectures,servingasanAPIgateway
