如果一台机器 php-fpm 进程数 20,那么就意味着 20 个请求可以同时处理吗?
PHP-FPM
是1:1 模型
。单机情况下,如果PHP-FPM
配置的最大子进程数为20
,那么就最多可以并发处理20
个请求。
PHP-FPM
采用 master/worker
多进程架构。
即:众多的 worker
进程组成了进程池,等待 master
进程分配任务,而且每个 worker
进程只能同时处理单个任务,前一个处理结束,才能为下一个服务。
参考:FPM 配置
按对子进程的管理类型,可通过不同的配置调整 worker
进程数:
static - 子进程的数量是固定的(pm.max_children)
ondemand - 进程在有需求时才产生(当请求时,与 dynamic 相反,pm.start_servers 在服务启动时即启动
dynamic - 子进程的数量在下面配置的基础上动态设置:pm.max_children,pm.start_servers,pm.min_spare_servers,pm.max_spare_servers
版本:PHP-5.6
文件位置:vim sapi/fpm/fpm/fpm.c +93
从 fpm_run
方法中,也可以看出只给每个空闲的子进程分配一个请求任务。
/* children: return listening socket
parent: never return */
int fpm_run(int *max_requests) /* {{{ */
{
struct fpm_worker_pool_s *wp;
/* create initial children in all pools */
for (wp = fpm_worker_all_pools; wp; wp = wp->next) {
int is_parent;
is_parent = fpm_children_create_initial(wp);
if (!is_parent) {
goto run_child;
}
/* handle error */
if (is_parent == 2) {
fpm_pctl(FPM_PCTL_STATE_TERMINATING, FPM_PCTL_ACTION_SET);
fpm_event_loop(1);
}
}
/* run event loop forever */
fpm_event_loop(0);
run_child: /* only workers reach this point */
fpm_cleanups_run(FPM_CLEANUP_CHILD);
*max_requests = fpm_globals.max_requests;
return fpm_globals.listening_socket;
}
/* }}} */
参考:PHP-FPM运行原理
FPM
只是 PHP
官方实现的 fast-cgi
进程管理器。
对应的也有一些替代的方案,比如:采用异步非阻塞多进程模型的 swoole-http-server
参考:swoole-http-server
当然,在现实使用场景中,要根据实际需求来做技术选型。
1 回答4k 阅读✓ 已解决
3 回答1.8k 阅读✓ 已解决
2 回答2.2k 阅读✓ 已解决
1 回答1.3k 阅读✓ 已解决
2 回答2.2k 阅读
1 回答486 阅读✓ 已解决
771 阅读
进程上限设为20,就意味着同时只能处理20个请求。之后的请求会进行排队,这个排队由fpm主进程完成,nginx采用的是异步IO模型,不会产生阻塞。