什么是php-fpm?下面本篇帶大家了解一下php-fpm,介紹一下優(yōu)化 php-fpm 時(shí)我們到底要優(yōu)化什么,希望對大家有所幫助!
PHP是無處不在的,可以說是互聯(lián)網(wǎng) Web 應(yīng)用上使用最廣泛的語言。
然而,它的高性能并不為人所知,尤其是在涉及到高并發(fā)系統(tǒng)時(shí)。這就是為什么對于這樣特殊的用例,正在被 Node (是的,我知道,它不是一種語言)、Go 和 Elixir 等語言接管。
也就是說,您可以做很多事情來改進(jìn)服務(wù)器上的 PHP 性能。本文主要關(guān)注 php-fpm
方面的內(nèi)容,如果您使用Nginx,這是在服務(wù)器上的默認(rèn)配置。
如果你知道 php-fpm
是什么,請直接跳到優(yōu)化部分。
什么是 php-fpm?
許多開發(fā)人員對 DevOps 方面的知識不太感興趣,即使是那些對此感興趣的開發(fā)人員,也極少有人知道它的底層原理。有趣的是,當(dāng)瀏覽器發(fā)送一個(gè)請求到運(yùn)行 PHP 的服務(wù)器上時(shí),PHP 也不是最先進(jìn)行處理請求的服務(wù);而是,HTTP 服務(wù)器,Apache 和 Nginx 是其中最主要的兩個(gè)?!竪eb 服務(wù)器」決定如何與 PHP 進(jìn)行通信,然后傳遞請求的類型,數(shù)據(jù)和頭部信息到 PHP 進(jìn)程。
上圖是 PHP 項(xiàng)目的請求-響應(yīng)生命周期(圖片來源: ProinerTech)
在現(xiàn)代 PHP 應(yīng)用中,「find file」部分即為 index.php
文件,它是在服務(wù)器配置文件中配置的用于處理所有請求的代理。
如今,Web 服務(wù)器究竟如何連接 PHP 正在進(jìn)化,如果我們要深入研究所有細(xì)節(jié),這篇文章的長度將激增。但粗略來說, 在 Apache 作為 Web 服務(wù)器首選的時(shí)間段,PHP 是作為包含在服務(wù)器內(nèi)部的模塊。
所以每當(dāng)一個(gè)請求被接收,服務(wù)器將開啟一個(gè)新的進(jìn)程, 它將自動包含 PHP 和執(zhí)行請求。這個(gè)方法被稱作mod_php
,“PHP作為一個(gè)模塊”的縮寫。這種方法有其局限性,而 Nginx 和 php-fpm
克服了它。
在php-fpm
中,管理 PHP 的責(zé)任在于服務(wù)器內(nèi)部的 PHP 程序。換言之, Web 服務(wù)器 (Nginx, 在本例中), 不在乎 PHP 在哪和怎樣運(yùn)行的,只要它知道如何發(fā)送和接收數(shù)據(jù)即可。如果需要,在這種情況下,您可以將PHP視為另一臺服務(wù)器,它管理傳入請求的某些子PHP進(jìn)程(因此,我們將請求送到服務(wù)器,該請求由服務(wù)器接收并傳遞到服務(wù)器 — —太瘋狂了!:-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進(jìn)程通信。因此,對于每個(gè)傳入的請求,Nginx都通過這個(gè)文件寫入數(shù)據(jù),在接收到輸出后,將其發(fā)送回瀏覽器。
我必須再次強(qiáng)調(diào),對于如何運(yùn)行這不是最完整或者最準(zhǔn)確的,但對于大多數(shù) DevOps 任務(wù)是完全準(zhǔn)確的。
除此之外,讓我們回顧一下到目前為止所學(xué)到的東西:
- PHP不會直接接收瀏覽器發(fā)送的請求。像 Nginx 這種 Web 服務(wù)器首先會攔截它。
- Web 服務(wù)器知道如何連接到PHP進(jìn)程,并將所有請求數(shù)據(jù)(粘貼所有內(nèi)容)傳遞到 PHP 上。
- PHP 完成其職責(zé)后,會將響應(yīng)發(fā)送回 Web 服務(wù)器,然后將其發(fā)送回客戶端(在大多數(shù)情況下為瀏覽器)。
流程圖如下:
PHP 和 Nginx 如何協(xié)同工作? (圖片來源:數(shù)據(jù)狗)
到目前為止都不錯(cuò), 那么關(guān)鍵問題來了:PHP-FPM到底是什么呢?
PHP 中的 FPM
代表 「快速進(jìn)程管理器」, ?花式解釋就是說,在服務(wù)器上運(yùn)行的 PHP 并不是單個(gè)進(jìn)程,而是由這個(gè) FPM 進(jìn)程管理器派生、控制和終止的一些PHP 進(jìn)程。web服務(wù)器將請求傳遞給的就是這個(gè)進(jìn)程管理器。
PHP-FPM 本身就是一個(gè)完整的兔子洞,所以如果您愿意,可以隨意探索,但是對于我們的目的,這些解釋就足夠啦。 ?
為什么要優(yōu)化php-fpm?
一般在正常運(yùn)行的情況下,為什么要考慮優(yōu)化呢? 為什么不將事物保持原樣。
具有諷刺意味的是,一般我為大多數(shù)用例提供建議的話。 如果您的設(shè)置運(yùn)行良好,并且沒有特殊用例,請使用默認(rèn)設(shè)置。 但是,如果您希望擴(kuò)展一臺機(jī)器之外的能力,那么從一臺機(jī)器中擠出最大的處理能力是必不可少的,因?yàn)樗梢詫⒛?wù)器的花費(fèi)減少一半(甚至更多!)。
要說明的另一件事情是,Nginx是為處理巨大的工作負(fù)載而構(gòu)建的。 它能夠同時(shí)處理成千上萬的連接,但是如果您的PHP設(shè)置不合理,那么您將浪費(fèi)很多資源,因?yàn)镹ginx必須等待PHP完成當(dāng)前處理之后才可以接受下一個(gè)請求,最終Nginx不能為您的服務(wù)提供任何優(yōu)勢!
所以,接下來讓我們看看嘗試優(yōu)化 php-fpm
時(shí)我們到底要優(yōu)化什么。
如何優(yōu)化 PHP-FPM ?
php-fpm
的配置文件在不同服務(wù)器上的位置可能不同,因此您需要做一些調(diào)查來確定它的位置。在 UNIX 上,你可以使用 find 命令。在我的 Ubuntu 上,它的路徑是 /etc/php/7.2/fpm/php-fpm.conf
。當(dāng)然,7.2是我正在運(yùn)行的 PHP 版本。
下面是這個(gè)文件的前幾行代碼:
;;;;;;;;;;;;;;;;;;;;; ;?FPM?Configuration?; ;;;;;;;;;;;;;;;;;;;;; ;?All?relative?paths?in?this?configuration?file?are?relative?to?PHP'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
告訴我們哪個(gè)文件包含了 php-fpm
進(jìn)程的進(jìn)程 id。
我們還看到 /var/log/php7.2-fpm.log
是 php-fpm
存儲日志的地方。
在這個(gè)文件中,像下面這樣添加三個(gè)變量:
emergency_restart_threshold?10 emergency_restart_interval?1m process_control_timeout?10s
前兩個(gè)設(shè)置是警告性的,它們告訴 php-fpm
進(jìn)程,如果10個(gè)子進(jìn)程在一分鐘內(nèi)失敗,主 php-fpm
進(jìn)程應(yīng)該重新啟動自己。
這聽起來可能不夠穩(wěn)健,但是 PHP 是一個(gè)短暫的進(jìn)程,它會泄漏內(nèi)存,所以在出現(xiàn)高故障時(shí)重新啟動主進(jìn)程可以解決很多問題。
第三個(gè)選項(xiàng)是 process_control_timeout
,它告訴子進(jìn)程在執(zhí)行從父進(jìn)程接收到的信號之前需要等待這么長的時(shí)間。這個(gè)設(shè)置是非常有用的。例如,當(dāng)父進(jìn)程發(fā)送終止信號時(shí),子進(jìn)程正在處理某些事情的時(shí)候。十秒的時(shí)間,他們會有一個(gè)更好的機(jī)會完成任務(wù)并且優(yōu)雅地退出。
令人驚訝的是,這 不是 php-fpm 的核心配置!這是因?yàn)椋瑸榱?web 請求服務(wù),php-fpm
創(chuàng)建了一個(gè)新的進(jìn)程池,它將具有一個(gè)單獨(dú)的配置。在我的例子中,進(jìn)程池的名稱是 www
,我想編輯的文件是 /etc/php/7.2/fpm/pool.d/www.conf
。
讓我們來看看文件的內(nèi)容:
;?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
快速瀏覽一下上面代碼片段的末尾,您就會明白為什么服務(wù)器進(jìn)程以 www-data
的形式運(yùn)行了。如果您在設(shè)置網(wǎng)站時(shí)遇到文件權(quán)限問題,您可能要將目錄的所有者或組更改為 www-data
,從而允許PHP進(jìn)程寫入日志文件和上傳文檔等。
最后,我們到達(dá)了問題的根源,流程管理器 (pm) 設(shè)置。一般情況下,默認(rèn)值是這樣的:
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))」是什么意思呢?我認(rèn)為官方文檔最好地解釋了這一點(diǎn)(我的意思是,這應(yīng)該已經(jīng)是您正在編輯的文件的一部分,但是我在這里復(fù)制了它,以防它不是):
;?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.
由此可見,有三個(gè)可用值:
- Static: 無論什么情況,都會保持一個(gè)固定的PHP進(jìn)程數(shù)量。
-
Dynamic: 我們需要指定
php-fpm
在任何給定時(shí)間點(diǎn)會保持活動的最小以及最大進(jìn)程數(shù)量。 - ondemand: 按照需求創(chuàng)建和銷毀進(jìn)程。
那這些設(shè)置有什么影響呢?
簡而言之,如果你有個(gè)小流量的網(wǎng)站,“dynamic”設(shè)置在大多數(shù)時(shí)間內(nèi)都是一種資源的浪費(fèi)。假設(shè)你的pm.min_spare_servers
設(shè)置成了3,那會有三個(gè)PHP進(jìn)程會被創(chuàng)建并保持運(yùn)行,甚至是網(wǎng)站沒有流量時(shí)。這種情況下,“ondemand” 就是個(gè)更好的選擇, 可以讓系統(tǒng)決定何時(shí)啟動新的進(jìn)程。
另一方面, 大流量 或者必須快速響應(yīng)的網(wǎng)站將在這種情況下被懲罰。 最好避免創(chuàng)建新的 PHP 進(jìn)程的額外開銷,使其成為池的一部分并對其進(jìn)行監(jiān)控。
使用?pm = static
?固定子進(jìn)程的數(shù)量,使最大的系統(tǒng)資源用于服務(wù)請求而不是管理 PHP。假如你確定走這條路,注意它有其指導(dǎo)方針和陷阱.關(guān)于它的一篇相當(dāng)密集但非常有用的文章是?這篇 。
寫在最后
由于有關(guān)網(wǎng)絡(luò)性能的文章可能會引發(fā)爭論或使人們感到困惑,因此在結(jié)束本文之前,我覺得需要講幾句話。 性能調(diào)優(yōu)既涉及系統(tǒng)知識,也涉及猜測和技巧。
即使您完全了解 php-fpm
的所有設(shè)置,也無法保證成功。 如果您不了解 php-fpm
的存在,那么您就不必浪費(fèi)時(shí)間擔(dān)心它。 繼續(xù)做您已經(jīng)在做的事情并繼續(xù)下去。
同時(shí),盡可能不讓結(jié)果變得很戲劇性。 是的,您可以通過從頭開始重新編譯 PHP 并刪除所有不需要的模塊來獲得更好的性能,但是這種方法在生產(chǎn)環(huán)境中不夠明智。 優(yōu)化某些內(nèi)容的整個(gè)想法是查看您的需求是否與默認(rèn)值不同(它們很少這樣做?。?,并根據(jù)需要進(jìn)行較小的更改。
原文地址:https://geekflare.com/php-fpm-optimization/
譯文地址:https://learnku.com/php/t/34358
推薦:《PHP視頻教程》
以上是什么是php-fpm?如何進(jìn)行優(yōu)化來提升性能?的詳細(xì)內(nèi)容。更多信息請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費(fèi)脫衣服圖片

Undresser.AI Undress
人工智能驅(qū)動的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover
用于從照片中去除衣服的在線人工智能工具。

Clothoff.io
AI脫衣機(jī)

Video Face Swap
使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費(fèi)的代碼編輯器

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

禪工作室 13.0.1
功能強(qiáng)大的PHP集成開發(fā)環(huán)境

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

SublimeText3 Mac版
神級代碼編輯軟件(SublimeText3)

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

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

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

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

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

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

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

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