【相關學習推薦:php圖文教學】
#何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM是無所不在的,可以說是網路Web 應用程式上使用最廣泛的語言。
然而,它的高效能並不為人所知,尤其是在涉及高並發系統時。這就是為什麼對於這樣特殊的用例,正在被 Node (是的,我知道,它不是一種語言)、Go 和 Elixir 等語言接管。
也就是說,您可以做很多事情來改進伺服器上的 何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM 效能。本文主要關注 php-fpm
方面的內容,如果您使用Nginx,這是在伺服器上的預設配置。
如果你知道 php-fpm
是什麼,請直接跳到最佳化部分。
許多開發人員對DevOps 方面的知識不太感興趣,即使是那些對此感興趣的開發人員,也很少有人知道它的底層原理。有趣的是,當瀏覽器發送一個請求到運行 何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM 的伺服器上時,何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM 也不是最先進行處理請求的服務;而是,HTTP 伺服器,Apache 和 Nginx 是其中最主要的兩個。 「web 伺服器」決定如何與 何為是高效能最佳化何為是高效能最佳化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.sock
的socket
與php進程通訊。因此,對於每個傳入的請求,Nginx都透過這個檔案寫入數據,在接收輸出後,將其發送回瀏覽器。
我必須再次強調,對於如何運行這不是最完整或最準確的,但對於大多數 DevOps 任務是完全準確的。
除此之外,讓我們回顧一下到目前為止所學到的東西:
流程圖如下:
何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM 和 Nginx 如何協同工作? (圖片來源:資料狗)
到目前為止都不錯, 那麼關鍵問題來了:何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM-FPM到底是什麼呢?
何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM 中的FPM
代表「快速進程管理器」, 花式解釋就是說,在伺服器上運行的何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM 並不是單一進程,而是由這個FPM 進程管理器派生、控制和終止的一些何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM 進程。 web伺服器將請求傳遞給的就是這個進程管理器。
何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM-FPM 本身就是一個完整的兔子洞,所以如果您願意,可以隨意探索,但是對於我們的目的,這些解釋就足夠啦。 ?
一般在正常運作的情況下,為什麼要考慮最佳化呢?為什麼不將事物保持原樣。
諷刺的是,一般我為大多數用例提供建議的話。如果您的設定運作良好,且沒有特殊用例,請使用預設設定。但是,如果您希望擴展一台機器之外的能力,那麼從一台機器中擠出最大的處理能力是必不可少的,因為它可以將您伺服器的花費減少一半(甚至更多!)。
要说明的另一件事情是,Nginx是为处理巨大的工作负载而构建的。 它能够同时处理成千上万的连接,但是如果您的何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM设置不合理,那么您将浪费很多资源,因为Nginx必须等待何為是高效能最佳化何為是高效能最佳化PHP-FPM-FPM完成当前处理之后才可以接受下一个请求,最终Nginx不能为您的服务提供任何优势!
所以,接下来让我们看看尝试优化 php-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.log
是 php-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.
由此可见,有三个可用值:
php-fpm
在任何给定时间点会保持活动的最小以及最大进程数量。那这些设置有什么影响呢?
简而言之,如果你有个小流量的网站,“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中文網其他相關文章!