php-fpm初始化失敗,FPM的初始化 - [ PHP7的內核剖析 ] - 在線原生手冊 - php中文網

FPM的初始化

接下來看下fpm的啟動流程,從main()函數開始://sapi/fpm/fpm/fpm_main.cint?main(int?argc,?char?*argv[]){

...????//注冊SAPI:將全局變量sapi_module設置為cgi_sapi_module

sapi_startup(&cgi_sapi_module);

...????//執行php_module_starup()

if?(cgi_sapi_module.startup(&cgi_sapi_module)?==?FAILURE)?{????????return?FPM_EXIT_SOFTWARE;

}

...????//初始化

if(0?>?fpm_init(...)){

...

}

...

fpm_is_running?=?1;

fcgi_fd?=?fpm_run(&max_requests);//后面都是worker進程的操作,master進程不會走到下面

parent?=?0;

...

}

fpm_init()主要有以下幾個關鍵操作:

(1)fpm_conf_init_main():

解析php-fpm.conf配置文件,分配worker pool內存結構并保存到全局變量中:fpm_worker_all_pools,各worker pool配置解析到fpm_worker_pool_s->config中。

(2)fpm_scoreboard_init_main():?分配用于記錄worker進程運行信息的共享內存,按照worker pool的最大worker進程數分配,每個worker pool分配一個fpm_scoreboard_s結構,pool下對應的每個worker進程分配一個fpm_scoreboard_proc_s結構,各結構的對應關系如下圖。

67c1f4f4414714bf7b89408a82a7f754.png

(3)fpm_signals_init_main():static?int?sp[2];int?fpm_signals_init_main(){????struct?sigaction?act;

//創建一個全雙工管道

if?(0?>?socketpair(AF_UNIX,?SOCK_STREAM,?0,?sp))?{????????return?-1;

}????//注冊信號處理handler

act.sa_handler?=?sig_handler;

sigfillset(&act.sa_mask);????if?(0?>?sigaction(SIGTERM,??&act,?0)?||????????0?>?sigaction(SIGINT,???&act,?0)?||????????0?>?sigaction(SIGUSR1,??&act,?0)?||????????0?>?sigaction(SIGUSR2,??&act,?0)?||????????0?>?sigaction(SIGCHLD,??&act,?0)?||????????0?>?sigaction(SIGQUIT,??&act,?0))?{????????return?-1;

}????return?0;

}

這里會通過socketpair()創建一個管道,這個管道并不是用于master與worker進程通信的,它只在master進程中使用,具體用途在稍后介紹event事件處理時再作說明。另外設置master的信號處理handler,當master收到SIGTERM、SIGINT、SIGUSR1、SIGUSR2、SIGCHLD、SIGQUIT這些信號時將調用sig_handler()處理:static?void?sig_handler(int?signo){????static?const?char?sig_chars[NSIG?+?1]?=?{

[SIGTERM]?=?'T',

[SIGINT]??=?'I',

[SIGUSR1]?=?'1',

[SIGUSR2]?=?'2',

[SIGQUIT]?=?'Q',

[SIGCHLD]?=?'C'

};????char?s;

...

s?=?sig_chars[signo];????//將信號通知寫入管道sp[1]端

write(sp[1],?&s,?sizeof(s));

...

}

(4)fpm_sockets_init_main()

創建每個worker pool的socket套接字。

(5)fpm_event_init_main():

啟動master的事件管理,fpm實現了一個事件管理器用于管理IO、定時事件,其中IO事件通過kqueue、epoll、poll、select等管理,定時事件就是定時器,一定時間后觸發某個事件。

在fpm_init()初始化完成后接下來就是最關鍵的fpm_run()操作了,此環節將fork子進程,啟動進程管理器,另外master進程將不會再返回,只有各worker進程會返回,也就是說fpm_run()之后的操作均是worker進程的。int?fpm_run(int?*max_requests){????struct?fpm_worker_pool_s?*wp;

for?(wp?=?fpm_worker_all_pools;?wp;?wp?=?wp->next)?{????????//調用fpm_children_make()?fork子進程

is_parent?=?fpm_children_create_initial(wp);

if?(!is_parent)?{????????????goto?run_child;

}

}????//master進程將進入event循環,不再往下走

fpm_event_loop(0);

run_child:?//只有worker進程會到這里

*max_requests?=?fpm_globals.max_requests;????return?fpm_globals.listening_socket;?//返回監聽的套接字}

在fork后worker進程返回了監聽的套接字繼續main()后面的處理,而master將永遠阻塞在fpm_event_loop(),接下來分別介紹master、worker進程的后續操作。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/534822.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/534822.shtml
英文地址,請注明出處:http://en.pswp.cn/news/534822.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python 高級語言特性_Pytohon學習筆記(一)Python編程語言歷史及特性

Python編程語言歷史及特性編程語言:用戶:問題空間計算機: 解決問題解空間抽象機器代碼-->微碼編程-->高級語言shell編程:ptyhon控制語言:膠水語言適合領域:web,Django字節碼:bytecode面向過程:以指令為中心,由指令處理數據 如何組織代碼結局問題面向對象:以數…

php laravel 返回統一格式,封裝的統一的Laravel響應類,返回數據類

封裝的統一的Laravel返回數據類namespace App\Library;class Response{const OK 0;const BAD_REQUEST 1000;const PARAM_ERROR 1001;const SQL_ERROR 4000;const FORBIDDEN 4003;const SERVER_ERROR 5000;public static $errMsg [self::BAD_REQUEST > 請求錯誤,self:…

python3連接數據庫步驟_Python3連接Mysql8.0遇到的問題及處理步驟

最近在使用Python開發系統,需連接mysql數據庫,我用的是Python3連接MySQL8.0,其中老是報錯以下問題:網上給了各種各樣的方法,大多是通過各種方式修改密碼。最簡單的方法是更換了root密碼的認證方式解決的,新…

360手柄搖桿漂移修復_徹底解決你的Switch手柄搖桿問題,最省錢的完美修復。

我想很多Switch的消費者都遇到了一個問題,用久了之后的手柄失靈,移動不精準,卡頓,自動位移等現象。玩個游戲都非常的糟心。動一下搖桿角色都會自動移動...這些問題的出現主要原因是搖桿內部進了灰塵,才導致各種現象的出…

libzdb 連接mysql,數據庫連接池庫libzdb使用教程

Libzdb挺強大, 支持Mysql Oracle SQLite PostgreSQL,支持C和C Object C,不能在Window下用(看源碼是因為基于Linux線程機制編寫實現)。遺憾的是找個資料太費勁,只能到Libzdb官網:點此進入 ,今正看著上面英文…

請給出計算231-1的python表達式_【填空題】計算2 32 -1的Python表達式可以書寫為____...

【填空題】計算2 32 -1的Python表達式可以書寫為____更多相關問題【判斷題】軍隊和國防建設指導思想實行戰略轉變的實質是:從立足于早打、大打、打核戰爭的臨戰準備狀況,轉到和平時期建設的軌道上來。【單選題】社會學家認為,一門專業必須具有專業特征,護理專業的特征是( )A. 滿…

數值分析方程求根實驗matlab,數值分析實驗之非線性方程求根(MATLAB實現)

一、實驗目的1. 了解一般非線性方程的求根是比較復雜的事情:要討論(或知道)它有無實根,有多少實根;知道求近似根常用的幾種方法,每種方法的特點是什么。2. 用通過二分法(區間半分法)、不動點(也Picard)迭代…

python多線程輸出_萌新python多線程

剛開始學習多線程的時候鬧了個笑話在使用python線程打印東西的時候發現自己定的的線程數據沒有打印,找半天都沒有找到問題,也沒好意思問,自己憋了半天才發現問題!代碼如下:import threadingdef SayHi():print(say hi !)def SeyHello():print(say hello !)print(start)threading…

php5.6擴展編寫,php 5.6版本中編寫一個PHP擴展的簡單示例

php 5.6版本中編寫一個PHP擴展的簡單示例這篇文章主要介紹了php 5.6版本中編寫一個PHP擴展的簡單示例,本文給出擴展實現代碼、編譯方法、配置方法和使用例子等內容,需要的朋友可以參考下有時候在php本身沒有滿足需求的api時候,需要自己寫相應的擴展,擴展…

iis php 數據庫亂碼,如何解決php插入數據亂碼問題

php插入數據亂碼的解決辦法:首先要設置數據表的字符集為utf8;然后修改字符集格式;接著建立字符集為utf-8的數據庫;最后通過php mysql語句插入數據即可。mysql數據庫亂碼問題解決辦法我們在使用數據庫(mysql)的時候最怕的就是數據庫…

python 文檔字符串_新款Python文檔字符串生成器來了

又一款懶人神器問世了:Visual Studio Code的擴展,基于CodeBERT的Python文檔字符串生成器。看來現在,這群偷「懶」的程序員們連文檔字符串都不想自己寫了。基于CodeBERT的生成器跟正常的DocStrings用法一樣,你只需要輸入三引號「“…

php 棧實現歷史記錄后退,棧:如何實現瀏覽器的前進和后退功能

受限制的線性表先進后出實現一個棧數組實現叫順序棧public class ArrayStack {private String[] items;//存儲數據的數組private int count;//棧中的元素private int n;//棧的大小public ArrayStack(int n){this.items new String[n];this.n n;this.count 0;}//入棧操作publ…

vc 通過句柄修改窗口大小_VC應用(1)通過VC修改銷售訂單行項目的字段

VC是SAP中非常重要的功能,過去多年來,我參與了不少使用VC的項目,我將通過多篇文章介紹VC的一些應用,本文介紹通過VC修改銷售訂單行項目的字段01 概覽在銷售訂單創建時,對于可配置物料來說,不同的配置可能會…

mysql增加實例,MySQL的簡單使用筆記:增加實例以及啟動

增加實例增加實例這里指的的在源碼編譯安裝完MySQL之后建立一個初始的數據庫實例,占用某一端口,或者是使用新端口啟動新的mysqld進程。MySQL需要一些基礎的數據庫以及表來完成基本的設定,比如控制連接的mysql.user表:123456789101…

springboot starter工作原理_98,談談SpringBoot的工作原理

對技術的探索,一切源于好奇心,保持好奇心,才能讓人更年輕。至今,我們已經有了很多創建SpringBoot項目的經驗,比如我們要創建一個支持web開發的項目,我們只需要引入web-starter模塊即可。那么,Sp…

精英主義 遺傳算法 matlab,遺傳算法優化 - osc_lfs4vsih的個人空間 - OSCHINA - 中文開源技術交流社區...

1.遺傳算法簡介遺傳算法是一種基于自然選擇和群體遺傳機理的搜索算法,它模擬了自然選擇和自然遺傳過程中的繁殖、雜交和突變現象.再利用遺傳算法求解問題時,問題的每一個可能解都被編碼成一個“染色體”,即個體,若干個個體構成了群體(所有可能解).在遺傳算法開始時,總是隨機的產…

python 類靜態屬性_如何從Python中的類中引用靜態屬性?

您面臨的問題是因為您不了解類聲明的作用域是如何工作的。類聲明在其自己的作用域內執行。執行完成后,將創建一個新的類對象,并將獲得的范圍作為其__dict__附加到該類。在注意:類范圍是從方法范圍內搜索的而不是!這意味著當在方法…

php后臺管理員登錄密碼錯誤,如果后臺管理員的密碼錯誤,我該怎么辦,還有兩種找回密碼的方法...

Dedecms是中國著名的網站管理核心. 由于編織夢想簡單易用,因此可以進行二次開發,并且可以實現各種網站. 在使用dedecms的過程中,如果忘記了夢想管理后臺的密碼怎么辦?神山個人博客分享了兩種修改(重置)管理員密碼的方法.1. 下載織…

python logging模塊 默認_python logging模塊

函數式簡單配置importlogginglogging.debug(debug message) #計算或者工作的細節logging.info(info message) #記錄一些用戶的增刪改查的操作logging.warning(warning message) #警告操作logging.error(error message) #警告操作logging.critical(critical message) #批判的 直…

mac安裝多php環境變量配置,Mac如何安裝多個php版本

Mac安裝多個php版本的方法:首先打開Mac上的終端工具,并確認安裝Homebrew;然后安裝【php5.5】及對應擴展;最后執行指令【brew unlink php55】刪除brew中php的軟鏈即可。Mac安裝多個php版本的方法:1、打開Mac上的終端工具…