搜尋
首頁後端開發php教程何為是高效能最佳化PHP-FPM

何為是高效能最佳化PHP-FPM

【相關學習推薦:php圖文教學

#何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM是無所不在的,可以說是網路Web 應用程式上使用最廣泛的語言。

然而,它的高效能並不為人所知,尤其是在涉及高並發系統時。這就是為什麼對於這樣特殊的用例,正在被 Node (是的,我知道,它不是一種語言)、Go 和 Elixir 等語言接管。

也就是說,您可以做很多事情來改進伺服器上的 何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM 效能。本文主要關注 php-fpm 方面的內容,如果您使用Nginx,這是在伺服器上的預設配置。

如果你知道 php-fpm 是什麼,請直接跳到最佳化部分。

什麼是php-fpm?

許多開發人員對DevOps 方面的知識不太感興趣,即使是那些對此感興趣的開發人員,也很少有人知道它的底層原理。有趣的是,當瀏覽器發送一個請求到運行 何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM 的伺服器上時,何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM 也不是最先進行處理請求的服務;而是,HTTP 伺服器,Apache 和 Nginx 是其中最主要的兩個。 「web 伺服器」決定如何與 何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM 進行通信,然後傳遞請求的類型,資料和頭部資訊到 何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM 進程。

何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM

上圖是何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM 專案的請求-回應生命週期(圖片來源: ProinerTech)

在現代何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM 應用中,「find file」部分即為index.php 文件,它是在伺服器設定檔中配置的用於處理所有請求的代理。

如今,Web 伺服器究竟如何連接 何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM 正在進化,如果我們要深入研究所有細節,這篇文章的長度將會激增。但粗略來說, 在 Apache 作為 Web 伺服器首選的時間段,何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM 是作為包含在伺服器內部的模組。

所以每當一個請求被接收,伺服器將開啟一個新的進程, 它將自動包含 何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM 和執行請求。這個方法被稱為mod_php,「何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM作為一個模組」的縮寫。這種方法有其局限性,而 Nginx 和 php-fpm 克服了它。

php-fpm中,管理 何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM 的責任在於伺服器內部的 何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM 程式。換言之, Web 伺服器 (Nginx, 在本例中), 不在乎 何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM 在哪和怎樣運行的,只要它知道如何發送和接收資料即可。如果需要,在這種情況下,您可以將何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM視為另一台伺服器,它管理傳入請求的某些子何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM進程(因此,我們將請求送到伺服器,該請求由伺服器接收並傳遞到伺服器— —太瘋狂了!:-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.socksocket與php進程通訊。因此,對於每個傳入的請求,Nginx都透過這個檔案寫入數據,在接收輸出後,將其發送回瀏覽器。

我必須再次強調,對於如何運行這不是最完整或最準確的,但對於大多數 DevOps 任務是完全準確的。

除此之外,讓我們回顧一下到目前為止所學到的東西:

  • 何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM不會直接接收瀏覽器發送的請求。像 Nginx 這種 Web 伺服器會先攔截它。
  • Web 伺服器知道如何連接到何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM進程,並將所有請求資料(貼上所有內容)傳遞到 何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM 上。
  • 何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM 完成其職責後,會將回應傳送回 Web 伺服器,然後將其傳送回客戶端(在大多數情況下為瀏覽器)。

流程圖如下:

何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM

何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM 和 Nginx 如何協同工作? (圖片來源:資料狗)

到目前為止都不錯, 那麼關鍵問題來了:何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM-FPM到底是什麼呢?

何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM 中的FPM 代表「快速進程管理器」,  花式解釋就是說,在伺服器上運行的何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM 並不是單一進程,而是由這個FPM 進程管理器派生、控制和終止的一些何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM 進程。 web伺服器將請求傳遞給的就是這個進程管理器。

何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM-FPM 本身就是一個完整的兔子洞,所以如果您願意,可以隨意探索,但是對於我們的目的,這些解釋就足夠啦。 ?

為什麼要最佳化php-fpm?

一般在正常運作的情況下,為什麼要考慮最佳化呢?為什麼不將事物保持原樣。

諷刺的是,一般我為大多數用例提供建議的話。如果您的設定運作良好,且沒有特殊用例,請使用預設設定。但是,如果您希望擴展一台機器之外的能力,那麼從一台機器中擠出最大的處理能力是必不可少的,因為它可以將您伺服器的花費減少一半(甚至更多!)。

要说明的另一件事情是,Nginx是为处理巨大的工作负载而构建的。 它能够同时处理成千上万的连接,但是如果您的何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM设置不合理,那么您将浪费很多资源,因为Nginx必须等待何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM完成当前处理之后才可以接受下一个请求,最终Nginx不能为您的服务提供任何优势!

所以,接下来让我们看看尝试优化 php-fpm 时我们到底要优化什么。

如何优化 何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM-FPM ?

php-fpm 的配置文件在不同服务器上的位置可能不同,因此您需要做一些调查来确定它的位置。在 UNIX 上,你可以使用 find 命令。在我的 Ubuntu 上,它的路径是 /etc/php/7.2/fpm/php-fpm.conf 。当然,7.2是我正在运行的 何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM 版本。

下面是这个文件的前几行代码:

;;;;;;;;;;;;;;;;;;;;;
; FPM Configuration ;
;;;;;;;;;;;;;;;;;;;;;

; All relative paths in this configuration file are relative to 何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM'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.logphp-fpm 存储日志的地方。

在这个文件中,像下面这样添加三个变量:

emergency_restart_threshold 10
emergency_restart_interval 1m
process_control_timeout 10s

前两个设置是警告性的,它们告诉 php-fpm 进程,如果10个子进程在一分钟内失败,主 php-fpm 进程应该重新启动自己。

这听起来可能不够稳健,但是 何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM 是一个短暂的进程,它会泄漏内存,所以在出现高故障时重新启动主进程可以解决很多问题。

第三个选项是 process_control_timeout,它告诉子进程在执行从父进程接收到的信号之前需要等待这么长的时间。这个设置是非常有用的。例如,当父进程发送终止信号时,子进程正在处理某些事情的时候。十秒的时间,他们会有一个更好的机会完成任务并且优雅地退出。

令人惊讶的是,这 不是 php-fpm 的核心配置!这是因为,为了 web 请求服务,php-fpm 创建了一个新的进程池,它将具有一个单独的配置。在我的例子中,进程池的名称是 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 的形式运行了。如果您在设置网站时遇到文件权限问题,您可能要将目录的所有者或组更改为 www-data,从而允许何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM进程写入日志文件和上传文档等。

最后,我们到达了问题的根源,流程管理器 (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(动态)」是什么意思呢?我认为官方文档最好地解释了这一点(我的意思是,这应该已经是您正在编辑的文件的一部分,但是我在这里复制了它,以防它不是):

; 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-FPM进程数量。
  • Dynamic: 我们需要指定php-fpm在任何给定时间点会保持活动的最小以及最大进程数量。
  • ondemand: 按照需求创建和销毁进程。

那这些设置有什么影响呢?

简而言之,如果你有个小流量的网站,“dynamic”设置在大多数时间内都是一种资源的浪费。假设你的pm.min_spare_servers设置成了3,那会有三个何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM进程会被创建并保持运行,甚至是网站没有流量时。这种情况下,“ondemand” 就是个更好的选择, 可以让系统决定何时启动新的进程。

另一方面, 大流量 或者必须快速响应的网站将在这种情况下被惩罚。 最好避免创建新的 何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM 进程的额外开销,使其成为池的一部分并对其进行监控。

使用 pm = static 固定子进程的数量,使最大的系统资源用于服务请求而不是管理 何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM。假如你确定走这条路,注意它有其指导方针和陷阱.关于它的一篇相当密集但非常有用的文章是 这篇 。

写在最后

由于有关网络性能的文章可能会引发争论或使人们感到困惑,因此在结束本文之前,我觉得需要讲几句话。 性能调优既涉及系统知识,也涉及猜测和技巧。

即使您完全了解 php-fpm 的所有设置,也无法保证成功。 如果您不了解 php-fpm 的存在,那么您就不必浪费时间担心它。 继续做您已经在做的事情并继续下去。

同時,盡可能不讓結果變得很戲劇性。是的,您可以透過從頭開始重新編譯 何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM 並刪除所有不需要的模組來獲得更好的效能,但這種方法在生產環境中不夠明智。優化某些內容的整個想法是查看您的需求是否與預設值不同(它們很少這樣做!),並根據需要進行較小的更改。

相關學習推薦:php程式設計(影片)

#

以上是何為是高效能最佳化PHP-FPM的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:learnku。如有侵權,請聯絡admin@php.cn刪除
PHP的當前狀態:查看網絡開發趨勢PHP的當前狀態:查看網絡開發趨勢Apr 13, 2025 am 12:20 AM

PHP在現代Web開發中仍然重要,尤其在內容管理和電子商務平台。 1)PHP擁有豐富的生態系統和強大框架支持,如Laravel和Symfony。 2)性能優化可通過OPcache和Nginx實現。 3)PHP8.0引入JIT編譯器,提升性能。 4)雲原生應用通過Docker和Kubernetes部署,提高靈活性和可擴展性。

PHP與其他語言:比較PHP與其他語言:比較Apr 13, 2025 am 12:19 AM

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP與Python:核心功能PHP與Python:核心功能Apr 13, 2025 am 12:16 AM

PHP和Python各有優勢,適合不同場景。 1.PHP適用於web開發,提供內置web服務器和豐富函數庫。 2.Python適合數據科學和機器學習,語法簡潔且有強大標準庫。選擇時應根據項目需求決定。

PHP:網絡開發的關鍵語言PHP:網絡開發的關鍵語言Apr 13, 2025 am 12:08 AM

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP:許多網站的基礎PHP:許多網站的基礎Apr 13, 2025 am 12:07 AM

PHP成為許多網站首選技術棧的原因包括其易用性、強大社區支持和廣泛應用。 1)易於學習和使用,適合初學者。 2)擁有龐大的開發者社區,資源豐富。 3)廣泛應用於WordPress、Drupal等平台。 4)與Web服務器緊密集成,簡化開發部署。

超越炒作:評估當今PHP的角色超越炒作:評估當今PHP的角色Apr 12, 2025 am 12:17 AM

PHP在現代編程中仍然是一個強大且廣泛使用的工具,尤其在web開發領域。 1)PHP易用且與數據庫集成無縫,是許多開發者的首選。 2)它支持動態內容生成和麵向對象編程,適合快速創建和維護網站。 3)PHP的性能可以通過緩存和優化數據庫查詢來提升,其廣泛的社區和豐富生態系統使其在當今技術棧中仍具重要地位。

PHP中的弱參考是什麼?什麼時候有用?PHP中的弱參考是什麼?什麼時候有用?Apr 12, 2025 am 12:13 AM

在PHP中,弱引用是通過WeakReference類實現的,不會阻止垃圾回收器回收對象。弱引用適用於緩存系統和事件監聽器等場景,需注意其不能保證對象存活,且垃圾回收可能延遲。

解釋PHP中的__ Invoke Magic方法。解釋PHP中的__ Invoke Magic方法。Apr 12, 2025 am 12:07 AM

\_\_invoke方法允許對象像函數一樣被調用。 1.定義\_\_invoke方法使對象可被調用。 2.使用$obj(...)語法時,PHP會執行\_\_invoke方法。 3.適用於日誌記錄和計算器等場景,提高代碼靈活性和可讀性。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器