亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

文字

概括來(lái)說(shuō),fpm的實(shí)現(xiàn)就是創(chuàng)建一個(gè)master進(jìn)程,在master進(jìn)程中創(chuàng)建并監(jiān)聽(tīng)socket,然后fork出多個(gè)子進(jìn)程,這些子進(jìn)程各自accept請(qǐng)求,子進(jìn)程的處理非常簡(jiǎn)單,它在啟動(dòng)后阻塞在accept上,有請(qǐng)求到達(dá)后開(kāi)始讀取請(qǐng)求數(shù)據(jù),讀取完成后開(kāi)始處理然后再返回,在這期間是不會(huì)接收其它請(qǐng)求的,也就是說(shuō)fpm的子進(jìn)程同時(shí)只能響應(yīng)一個(gè)請(qǐng)求,只有把這個(gè)請(qǐng)求處理完成后才會(huì)accept下一個(gè)請(qǐng)求,這一點(diǎn)與nginx的事件驅(qū)動(dòng)有很大的區(qū)別,nginx的子進(jìn)程通過(guò)epoll管理套接字,如果一個(gè)請(qǐng)求數(shù)據(jù)還未發(fā)送完成則會(huì)處理下一個(gè)請(qǐng)求,即一個(gè)進(jìn)程會(huì)同時(shí)連接多個(gè)請(qǐng)求,它是非阻塞的模型,只處理活躍的套接字。

fpm的master進(jìn)程與worker進(jìn)程之間不會(huì)直接進(jìn)行通信,master通過(guò)共享內(nèi)存獲取worker進(jìn)程的信息,比如worker進(jìn)程當(dāng)前狀態(tài)、已處理請(qǐng)求數(shù)等,當(dāng)master進(jìn)程要?dú)⒌粢粋€(gè)worker進(jìn)程時(shí)則通過(guò)發(fā)送信號(hào)的方式通知worker進(jìn)程。

fpm可以同時(shí)監(jiān)聽(tīng)多個(gè)端口,每個(gè)端口對(duì)應(yīng)一個(gè)worker pool,而每個(gè)pool下對(duì)應(yīng)多個(gè)worker進(jìn)程,類似nginx中server概念。


在php-fpm.conf中通過(guò)[pool name]聲明一個(gè)worker pool:

[web1]listen = 127.0.0.1:9000...[web2]listen = 127.0.0.1:9001...

啟動(dòng)fpm后查看進(jìn)程:ps -aux|grep fpm

root     27155  0.0  0.1 144704  2720 ?        Ss   15:16   0:00 php-fpm: master process (/usr/local/php7/etc/php-fpm.conf)
nobody   27156  0.0  0.1 144676  2416 ?        S    15:16   0:00 php-fpm: pool web1
nobody   27157  0.0  0.1 144676  2416 ?        S    15:16   0:00 php-fpm: pool web1
nobody   27159  0.0  0.1 144680  2376 ?        S    15:16   0:00 php-fpm: pool web2
nobody   27160  0.0  0.1 144680  2376 ?        S    15:16   0:00 php-fpm: pool web2

具體實(shí)現(xiàn)上worker pool通過(guò)fpm_worker_pool_s這個(gè)結(jié)構(gòu)表示,多個(gè)worker pool組成一個(gè)單鏈表:

struct fpm_worker_pool_s {
    struct fpm_worker_pool_s *next; //指向下一個(gè)worker pool
    struct fpm_worker_pool_config_s *config; //conf配置:pm、max_children、start_servers...
    int listening_socket; //監(jiān)聽(tīng)的套接字
    ...
    //以下這個(gè)值用于master定時(shí)檢查、記錄worker數(shù)
    struct fpm_child_s *children; //當(dāng)前pool的worker鏈表
    int running_children; //當(dāng)前pool的worker運(yùn)行總數(shù)
    int idle_spawn_rate;
    int warn_max_children;
    struct fpm_scoreboard_s *scoreboard; //記錄worker的運(yùn)行信息,比如空閑、忙碌worker數(shù)
    ...
}


上一篇: 下一篇: