鍍金池/ 問答/PHP/ php-fpm 進程數(shù) 20,那么就意味著 20 個請求可以同時處理嗎?

php-fpm 進程數(shù) 20,那么就意味著 20 個請求可以同時處理嗎?

如果一臺機器 php-fpm 進程數(shù) 20,那么就意味著 20 個請求可以同時處理嗎?

回答
編輯回答
蟲児飛

PHP-FPM1:1 模型。單機情況下,如果 PHP-FPM 配置的最大子進程數(shù)為 20,那么就最多可以并發(fā)處理 20 個請求。

原因

PHP-FPM 采用 master/worker 多進程架構(gòu)。
即:眾多的 worker 進程組成了進程池,等待 master 進程分配任務(wù),而且每個 worker 進程只能同時處理單個任務(wù),前一個處理結(jié)束,才能為下一個服務(wù)。

FPM 配置

參考:FPM 配置
按對子進程的管理類型,可通過不同的配置調(diào)整 worker 進程數(shù):

  • static - 子進程的數(shù)量是固定的(pm.max_children)

  • ondemand - 進程在有需求時才產(chǎn)生(當請求時,與 dynamic 相反,pm.start_servers 在服務(wù)啟動時即啟動

  • dynamic - 子進程的數(shù)量在下面配置的基礎(chǔ)上動態(tài)設(shè)置:pm.max_children,pm.start_servers,pm.min_spare_servers,pm.max_spare_servers

相關(guān)的 Zend 源碼

版本:PHP-5.6
文件位置:vim sapi/fpm/fpm/fpm.c +93
fpm_run 方法中,也可以看出只給每個空閑的子進程分配一個請求任務(wù)。

/*    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 官方實現(xiàn)的 fast-cgi 進程管理器。
對應(yīng)的也有一些替代的方案,比如:采用異步非阻塞多進程模型的 swoole-http-server
參考:swoole-http-server

其他

當然,在現(xiàn)實使用場景中,要根據(jù)實際需求來做技術(shù)選型。

2018年4月20日 04:05
編輯回答
避風港

剛剛看到不好意思,這個的意思是同時處理20個請求 直到有某個請求處理完才會有新的請求進來

2017年1月28日 04:51
編輯回答
朕略萌

沒明白你說的什么意思

2018年3月15日 16:16
編輯回答
老梗

進程上限設(shè)為20,就意味著同時只能處理20個請求。之后的請求會進行排隊,這個排隊由fpm主進程完成,nginx采用的是異步IO模型,不會產(chǎn)生阻塞。

2018年7月26日 05:59