Maison  >  Article  >  développement back-end  >  Qu'est-ce que l'optimisation haute performance PHP-FPM

Qu'est-ce que l'optimisation haute performance PHP-FPM

coldplay.xixi
coldplay.xixiavant
2020-08-28 17:11:182261parcourir

Qu'est-ce que l'optimisation haute performance PHP-FPM

[Recommandations d'apprentissage associées : Tutoriel graphique Quest-ce que loptimisation haute performance Quest-ce que loptimisation haute performance PHP-FPM-FPM]

Quest-ce que loptimisation haute performance Quest-ce que loptimisation haute performance PHP-FPM-FPM est omniprésent et peut être considéré comme le plus utilisé dans les applications Web Internet. Un large éventail de langues.

Cependant, ses hautes performances ne sont pas bien connues, surtout lorsqu'il s'agit de systèmes à haute concurrence. C'est pourquoi, pour des cas d'utilisation aussi spécifiques, il est repris par des langages comme Node (oui, je sais, ce n'est pas un langage), Go et Elixir.

Cela dit, vous pouvez faire beaucoup de choses pour améliorer les performances Quest-ce que loptimisation haute performance Quest-ce que loptimisation haute performance PHP-FPM-FPM sur votre serveur. Cet article se concentre sur php-fpm, qui est la configuration par défaut sur le serveur si vous utilisez Nginx.

Si vous savez ce qu'est php-fpm, veuillez passer directement à la section optimisation.

Qu'est-ce que php-fpm ?

De nombreux développeurs ne sont pas très intéressés par les connaissances DevOps, et même ceux qui s'y intéressent, très peu connaissent son principe sous-jacent. Il est intéressant de noter que lorsque le navigateur envoie une requête à un serveur exécutant Quest-ce que loptimisation haute performance Quest-ce que loptimisation haute performance PHP-FPM-FPM, Quest-ce que loptimisation haute performance Quest-ce que loptimisation haute performance PHP-FPM-FPM n'est pas le premier service à traiter la requête, mais les serveurs HTTP, Apache et Nginx, sont les deux plus importants. Le « serveur Web » décide comment communiquer avec Quest-ce que loptimisation haute performance Quest-ce que loptimisation haute performance PHP-FPM-FPM, puis transmet le type de requête, les données et les informations d'en-tête au processus Quest-ce que loptimisation haute performance Quest-ce que loptimisation haute performance PHP-FPM-FPM.

Quest-ce que loptimisation haute performance Quest-ce que loptimisation haute performance PHP-FPM-FPM

L'image ci-dessus est le cycle de vie requête-réponse du projet Quest-ce que loptimisation haute performance Quest-ce que loptimisation haute performance PHP-FPM-FPM (Source de l'image : ProinerTech)

Dans les applications Quest-ce que loptimisation haute performance Quest-ce que loptimisation haute performance PHP-FPM-FPM modernes, le "fichier de recherche" " La partie est le fichier index.php, qui est le proxy configuré dans le fichier de configuration du serveur pour gérer toutes les requêtes.

La manière exacte dont les serveurs Web se connectent à Quest-ce que loptimisation haute performance Quest-ce que loptimisation haute performance PHP-FPM-FPM évolue ces jours-ci, et si nous devions entrer dans tous les détails, la longueur de cet article exploserait. Mais en gros, à l’époque où Apache était le serveur Web de choix, Quest-ce que loptimisation haute performance Quest-ce que loptimisation haute performance PHP-FPM-FPM était inclus en tant que module au sein du serveur.

Ainsi, chaque fois qu'une requête est reçue, le serveur démarrera un nouveau processus, qui contiendra automatiquement Quest-ce que loptimisation haute performance Quest-ce que loptimisation haute performance PHP-FPM-FPM et exécutera la requête. Cette méthode s'appelle mod_php, abréviation de "Quest-ce que loptimisation haute performance Quest-ce que loptimisation haute performance PHP-FPM-FPM as a module". Cette approche a ses limites, et Nginx et php-fpm les surmontent.

Dans php-fpm, la responsabilité de la gestion de Quest-ce que loptimisation haute performance Quest-ce que loptimisation haute performance PHP-FPM-FPM incombe au programme Quest-ce que loptimisation haute performance Quest-ce que loptimisation haute performance PHP-FPM-FPM à l'intérieur du serveur. En d’autres termes, le serveur Web (Nginx, dans ce cas) ne se soucie pas de savoir où et comment Quest-ce que loptimisation haute performance Quest-ce que loptimisation haute performance PHP-FPM-FPM s’exécute, tant qu’il sait comment envoyer et recevoir des données. Si nécessaire, dans ce cas, vous pouvez traiter Quest-ce que loptimisation haute performance Quest-ce que loptimisation haute performance PHP-FPM-FPM comme un autre serveur qui gère certains processus sous-Quest-ce que loptimisation haute performance Quest-ce que loptimisation haute performance PHP-FPM-FPM pour les requêtes entrantes (nous envoyons donc la requête au serveur, qui est reçue par le serveur et transmise au serveur — C'est fou ! :- P).

Si vous avez utilisé Nginx, vous verrez ce code :

     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;
    }

Pour cette ligne : fastcgi_pass unix:/run/php/php7.2-fpm.sock;, il indique à Nginx de communiquer avec le processus php via la communication php7.2-fpm.sock. Ainsi, pour chaque requête entrante, Nginx écrit des données via ce fichier et, après avoir reçu la sortie, la renvoie au navigateur. socket

Je dois souligner encore une fois que ce n'est pas le plus complet ni le plus précis sur la façon de l'exécuter, mais il est tout à fait précis pour la plupart des tâches DevOps.

Cela étant réglé, passons en revue ce que nous avons appris jusqu'à présent :

    Quest-ce que loptimisation haute performance Quest-ce que loptimisation haute performance PHP-FPM-FPM ne reçoit pas directement les requêtes envoyées par le navigateur. Les serveurs Web comme Nginx l'interceptent en premier.
  • Le serveur Web sait comment se connecter au processus Quest-ce que loptimisation haute performance Quest-ce que loptimisation haute performance PHP-FPM-FPM et transmettre toutes les données de la requête (tout coller) à Quest-ce que loptimisation haute performance Quest-ce que loptimisation haute performance PHP-FPM-FPM.
  • Une fois que Quest-ce que loptimisation haute performance Quest-ce que loptimisation haute performance PHP-FPM-FPM a terminé ses tâches, il renvoie la réponse au serveur web, qui la renvoie ensuite au client (dans la plupart des cas, le navigateur).
L'organigramme est le suivant :

Quest-ce que loptimisation haute performance Quest-ce que loptimisation haute performance PHP-FPM-FPM

Comment Quest-ce que loptimisation haute performance Quest-ce que loptimisation haute performance PHP-FPM-FPM et Nginx fonctionnent-ils ensemble ? (Source de l'image : Data Dog)

Jusqu'ici tout va bien, alors la question clé est : qu'est-ce que Quest-ce que loptimisation haute performance Quest-ce que loptimisation haute performance PHP-FPM-FPM-FPM exactement ?

Le

en Quest-ce que loptimisation haute performance Quest-ce que loptimisation haute performance PHP-FPM-FPM signifie "Fast Process Management" L'explication sophistiquée est que le Quest-ce que loptimisation haute performance Quest-ce que loptimisation haute performance PHP-FPM-FPM exécuté sur le serveur n'est pas un processus unique, mais un certain nombre de processus Quest-ce que loptimisation haute performance Quest-ce que loptimisation haute performance PHP-FPM-FPM générés, contrôlés et terminés par ce gestionnaire de processus FPM. C'est à ce gestionnaire de processus que le serveur Web transmet la requête. FPM

Quest-ce que loptimisation haute performance Quest-ce que loptimisation haute performance PHP-FPM-FPM-FPM est un véritable terrier de lapin en soi, alors n'hésitez pas à l'explorer si vous le souhaitez, mais pour nos besoins, ces explications suffiront. ?

Pourquoi devrions-nous optimiser php-fpm ?

De manière générale, dans des conditions normales de fonctionnement, pourquoi devrions-nous envisager une optimisation ? Pourquoi ne pas laisser les choses telles quelles.

Ironiquement, je donne généralement des conseils pour la plupart des cas d'utilisation. Si votre configuration fonctionne bien et que vous n'avez pas de cas d'utilisation particulier, utilisez les paramètres par défaut. Cependant, si vous souhaitez vous développer au-delà d'une seule machine, il est essentiel d'extraire la plus grande puissance de traitement d'une seule machine, car cela peut réduire de moitié (ou plus !) vos dépenses en matière de serveur.

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

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

如何优化 Quest-ce que loptimisation haute performance Quest-ce que loptimisation haute performance PHP-FPM-FPM-FPM ?

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

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

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

; All relative paths in this configuration file are relative to Quest-ce que loptimisation haute performance Quest-ce que loptimisation haute performance 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 进程应该重新启动自己。

这听起来可能不够稳健,但是 Quest-ce que loptimisation haute performance Quest-ce que loptimisation haute performance 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,从而允许Quest-ce que loptimisation haute performance Quest-ce que loptimisation haute performance 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: 无论什么情况,都会保持一个固定的Quest-ce que loptimisation haute performance Quest-ce que loptimisation haute performance PHP-FPM-FPM进程数量。
  • Dynamic: 我们需要指定php-fpm在任何给定时间点会保持活动的最小以及最大进程数量。
  • ondemand: 按照需求创建和销毁进程。

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

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

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

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

写在最后

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

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

En même temps, essayez de ne pas rendre les résultats aussi dramatiques que possible. Oui, vous pouvez obtenir de meilleures performances en recompilant Quest-ce que loptimisation haute performance Quest-ce que loptimisation haute performance PHP-FPM-FPM à partir de zéro et en supprimant tous les modules inutiles, mais cette approche n'est pas assez judicieuse dans un environnement de production. L'idée même de l'optimisation de quelque chose est de voir si vos besoins diffèrent des valeurs par défaut (c'est rarement le cas !) et d'apporter des modifications plus petites si nécessaire.

Recommandations d'apprentissage associées : programmation php (vidéo)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer