目錄
什麼是php-fpm?
為什麼要最佳化php-fpm?
如何优化 何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM-FPM ?
首頁 後端開發 php教程 何為是高效能最佳化PHP-FPM

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

Aug 28, 2020 pm 05:11 PM
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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱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.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

如何使用php-fpm進行高效能調優 如何使用php-fpm進行高效能調優 Jul 08, 2023 am 11:30 AM

如何使用php-fpm進行高效能調優PHP是一種非常流行的伺服器端腳本語言,廣泛用於開發網頁應用程式和動態網站。然而,隨著訪問量的增加,PHP應用程式的效能可能會受到影響。為了解決這個問題,我們可以使用php-fpm(FastCGIProcessManager)來進行高效能調優。本文將介紹如何使用php-fpm來提升PHP應用程式的效能,並提供程式碼範例。一、

如何使用PHP-FPM優化來提升PrestaShop應用程式的效能 如何使用PHP-FPM優化來提升PrestaShop應用程式的效能 Oct 05, 2023 pm 12:33 PM

如何使用PHP-FPM優化來提高PrestaShop應用程式的效能隨著電子商務產業的快速發展,PrestaShop成為了許多商家選擇的電子商務平台。然而,隨著商店規模的擴大和訪問量的增加,PrestaShop應用程式可能會遇到效能瓶頸。為了提高PrestaShop應用的效能,常見的方法是使用PHP-FPM來最佳化和改善應用的處理能力。 PHP-FPM(FastCGI

如何使用PHP-FPM最佳化提升WooCommerce應用的效能 如何使用PHP-FPM最佳化提升WooCommerce應用的效能 Oct 05, 2023 am 08:24 AM

如何使用PHP-FPM優化提高WooCommerce應用的效能概述WooCommerce是一個非常流行的電子商務插件,用於在WordPress網站上建立和管理線上商店。然而,隨著商店的成長和流量的增加,WooCommerce應用可能會變得緩慢且不穩定。為了解決這個問題,我們可以使用PHP-FPM來優化和提升WooCommerce應用的效能。什麼是PHP-FP

利用php-fpm連接池提升資料庫存取效能 利用php-fpm連接池提升資料庫存取效能 Jul 07, 2023 am 09:24 AM

利用php-fpm連線池提升資料庫存取效能概述:在網路開發中,資料庫的存取是非常頻繁且耗時的操作之一。傳統的方法是每次資料庫操作都新建一個資料庫連接,使用完畢後再關閉連接。這種方式會造成資料庫連線的頻繁建立和關閉,增加了系統的開銷。為了解決這個問題,可以利用php-fpm連接池技術來提升資料庫存取效能。連接池的原理:連接池是一種快取技術,將一定數量的資料庫

php-fpm調優方法詳解 php-fpm調優方法詳解 Jul 08, 2023 pm 04:31 PM

PHP-FPM是一種常用的PHP流程管理器,用於提供更好的PHP效能和穩定性。然而,在高負載環境下,PHP-FPM的預設配置可能無法滿足需求,因此我們需要對其進行調優。本文將詳細介紹PHP-FPM的調優方法,並給予一些程式碼範例。一、增加進程數預設情況下,PHP-FPM只啟動少量的進程來處理請求。在高負載環境下,我們可以透過增加進程數來提高PHP-FPM的同時

如何利用PHP-FPM優化提升Phalcon應用的效能 如何利用PHP-FPM優化提升Phalcon應用的效能 Oct 05, 2023 pm 01:54 PM

如何利用PHP-FPM優化提升Phalcon應用的效能導語:Phalcon是一個高效能的PHP框架,結合PHP-FPM可以進一步提升應用的效能。本文將介紹如何利用PHP-FPM優化Phalcon應用的效能,並提供具體的程式碼範例。一、什麼是PHP-FPMPHP-FPM(PHPFastCGIProcessManager)是獨立於Web伺服器的PHP進程

ubuntu沒有php-fpm怎麼辦 ubuntu沒有php-fpm怎麼辦 Feb 03, 2023 am 10:51 AM

ubuntu沒有php-fpm的解決方法:1、執行「sudo apt-get」指令來加入php的來源位址;2、檢視有沒有php7的套件;3、透過「sudo apt-get install」指令安裝PHP;4 、修改設定監聽9000埠來處理nginx的請求;5、透過「sudo service php7.2-fpm start」啟動「php7.2-fpm」即可。

什麼是php-fpm?如何進行優化來提升效能? 什麼是php-fpm?如何進行優化來提升效能? May 13, 2022 pm 07:56 PM

什麼是php-fpm?以下這篇帶大家了解一下php-fpm,介紹一下優化 php-fpm 時我們到底要優化什麼,希望對大家有幫助!

See all articles