浅析php-fpm静态和动态执行方式的比较
前言
php-fpm 是 PHP 官方针对处理高并发等情况下的替代 FCGI 环境的进程管理器,相较于传统的 php-cgi 方式,php-fpm 众多的优异表现,比如在性能、应对并发、改善 PHP 进程管理等方面。
php-fpm 提供了两种执行方式:静态执行和动态执行。静态方式在 PHP-FPM 启动时,根据 PHP-FPM 配置(php-fpm.conf)中的值,将 PHP 进程预先创建好;而动态方式则是通过请求进来时,根据配置动态地创建多个 PHP 进程或进行关闭,不会像静态方式耗费大量的内存资源。
下面将对两者进行详细的解析和比较分析。
静态执行
在 PHP-FPM 静态执行模式下,每个 PHP 进程都直接绑定到相应的 FastCGI 端口号上,相应的信息会保存在 Sockets 结构体中,而每个进程在 PHP-FPM 启动时,根据 php-fpm.conf 中的配置值初始化一定的子进程。
一些示例的代码:
[www]
listen = /var/run/php-fpm/php-fpm.sock
listen.backlog = -1
user = nginx
group = nginx
pm = static
pm.max_requests = 1000
pm.status_path = /status
ping.path = /ping
pm.start_servers = 30
pm.min_spare_servers = 20
pm.max_spare_servers = 30
可知,pm.static 就是表明使用了 PHP-FPM 静态方式,并通过 pm.start_servers、pm.min_spare_servers、pm.max_spare_servers 控制预启动进程数量。
静态方式优缺点分析:
优点:
-
性能较好:PHP-FPM 在启动时,会创建指定数量的子进程,当请求到达时,可由子进程直接处理,避免了频繁创建和关闭的问题,从而降低了一定的处理时延。
-
稳定性高:静态方式中由于子进程提前创建,可以将生命周期固定住,故而较为稳定。
缺点:
-
可能导致内存浪费:由于指定了预启动进程数量,若状态空闲,则有一部分资源将被浪费。
-
无法应对突发的流量:静态方式中为事先启动一个预设的固定进程,若系统负载突然增高,程序会被卡死,无法响应请求。
动态执行
在 PHP-FPM 动态执行模式下,每个 PHP 进程是在发起请求后才会被启动和打开 FastCGI 端口并监听,当连接关闭或持续空闲超时后,PHP 进程将会被销毁。
相应的配置示例:
pm = dynamic
pm.start_servers = 5
pm.max_children = 60
pm.min_spare_servers = 5
pm.max_spare_servers = 30
pm.max_requests = 500
pm.process_idle_timeout = 10s
配置可以发现,pm = dynamic 就是表示使用了 PHP-FPM 动态方式,而 pm.start_servers 设置 PHP-FPM 启动时 spair_servers 的默认值,而 pm.max_children 则表明可以活跃的进程数,pm.process_idle_timeout 表示进程空闲时间,在空闲超时后会被自动销毁。
动态方式优缺点分析:
优点:
-
可更好地利用资源:动态方式中可以根据请求的相对负载自我调整,而不必预先启动多个进程,最大限度地发挥机器资源。
-
能够更加灵活地应对流量变化:当流量突然涌来时,动态方式可以根据实时情况调整进程数量,来平衡系统负载,提高系统的稳定性和响应能力。
缺点:
-
可能因启动和销毁进程而带来一定消耗:动态方式中由于进程相当于是每次收到请求,中都会进行启动和销毁,因此有一定的消耗。
-
可能会增加其他问题:由于只有当请求到达时才被启动,因此在初次请求时,会增加从外部请求PHP进程并启动的时间,因此当流量较高时,会增加无法访问或响应不及时的问题。
总结
无论是静态还是动态方式,都有其优点和缺点,根据预期要处理的流量和资源可以选择不同的模式,如果流量非常低,静态方式是比较合适的,而如果流量较大或者在处理复杂的应用程序时应使用动态方式。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅析php-fpm静态和动态执行方式的比较 - Python技术站