摘要:作者鏈接來(lái)源簡(jiǎn)書著作權(quán)歸作者所有,本文已獲得作者授權(quán)轉(zhuǎn)載,并對(duì)原文進(jìn)行了重新的排版。文件重載管理進(jìn)程注冊(cè)了一個(gè)名為的該進(jìn)程會(huì)在系統(tǒng)引導(dǎo)的最后一個(gè)階段,即啟動(dòng)前啟動(dòng)。
作者:bromine
鏈接:https://www.jianshu.com/p/e63...
來(lái)源:簡(jiǎn)書
著作權(quán)歸作者所有,本文已獲得作者授權(quán)轉(zhuǎn)載,并對(duì)原文進(jìn)行了重新的排版。
Swoft Github: https://github.com/swoft-clou...
不同于PHP-FPM每次請(qǐng)求都會(huì)加載一次PHP代碼,常駐型應(yīng)用只會(huì)讀取一次源文件,為了避免每次發(fā)布/調(diào)試代碼都需要手動(dòng)重啟Swoft應(yīng)用,Swoft提供了自動(dòng)重載代碼的功能。
文件重載管理進(jìn)程Swoft注冊(cè)了一個(gè)名為reload的Process,該進(jìn)程會(huì)在系統(tǒng)引導(dǎo)的最后一個(gè)階段,即Swoole啟動(dòng)前啟動(dòng)。該P(yáng)rocess會(huì)啟動(dòng)名為reload的Bean
//SwoftProcessBootstrapProcessReloadProcess.php /** * Relaod process * * @Process(name="reload", boot=true) */ class ReloadProcess implements ProcessInterface { /** * @param SwoftProcessProcess $process */ public function run(SwoftProcess $process) { $pname = App::$server->getPname(); $processName = sprintf("%s reload process", $pname); $process->name($processName); /* @var SwoftProcessBootstrapReload $relaod */ $relaod = App::getBean(Reload::class); $relaod->run(); } //..... }文件更新監(jiān)聽Bean
//SwoftProcessBootstrapReload::class /** * @Bean() */ class Reload { //code ..... /** * 啟動(dòng)監(jiān)聽 */ public function run() { $server = App::$server; while (true) { sleep($this->interval); //FileHelper::md5File()負(fù)責(zé)遞歸的計(jì)算文件夾的md5,其實(shí)改名為FileHelper::md5Dir()更合適,因?yàn)樗唤邮芊悄夸浀奈募鳛閰?shù) $md5File = FileHelper::md5File($this->watchDir);//$this->watchDir固定為@app別名對(duì)應(yīng)的文件夾 if (strcmp($this->md5File, $md5File) !== 0) { echo "Start reloading... "; $server->isRunning(); //md5和上次不一致就通知swoole重啟服務(wù) $server->getServer()->reload(); echo "Reloaded "; } $this->md5File = $md5File; } } }
代碼自動(dòng)重載的機(jī)制也很簡(jiǎn)單,每間隔幾秒遞歸的計(jì)算@app目錄下所有php文件的哈希值,發(fā)現(xiàn)文件夾的md5和之前的值有差別則通知Swoole重啟worker進(jìn)程。
Swoole WorkerStart事件Swoole會(huì)通知各個(gè)worker重啟,觸發(fā)Swoole事件WorkerStart,具體的回調(diào)事件如下
namespace SwoftBootstrapServerServerTrait.php; /** * OnWorkerStart event callback * * @param Server $server server * @param int $workerId workerId * @throws InvalidArgumentException */ public function onWorkerStart(Server $server, int $workerId) { // Init Worker and TaskWorker $setting = $server->setting; $isWorker = false; if ($workerId >= $setting["worker_num"]) { // TaskWorker ApplicationContext::setContext(ApplicationContext::TASK); ProcessHelper::setProcessTitle($this->serverSetting["pname"] . " task process"); } else { // Worker $isWorker = true; ApplicationContext::setContext(ApplicationContext::WORKER); ProcessHelper::setProcessTitle($this->serverSetting["pname"] . " worker process"); } //觸發(fā)一個(gè)Swoft服務(wù)事件```SwooleEvent::ON_START```,其監(jiān)聽者使用@ServerListener(event=SwooleEvent::ON_START)聲明 $this->fireServerEvent(SwooleEvent::ON_WORKER_START, [$server, $workerId, $isWorker]); //主要是重新掃描加載注解和Bean的重載 $this->beforeWorkerStart($server, $workerId, $isWorker); }
Swoft源碼剖析系列目錄:https://segmentfault.com/a/11...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/28693.html
摘要:作者鏈接來(lái)源簡(jiǎn)書著作權(quán)歸作者所有,本文已獲得作者授權(quán)轉(zhuǎn)載,并對(duì)原文進(jìn)行了重新的排版。同時(shí)順手整理個(gè)人對(duì)源碼的相關(guān)理解,希望能夠稍微填補(bǔ)學(xué)習(xí)領(lǐng)域的空白。系列文章只會(huì)節(jié)選關(guān)鍵代碼輔以思路講解,請(qǐng)自行配合源碼閱讀。 作者:bromine鏈接:https://www.jianshu.com/p/2f6...來(lái)源:簡(jiǎn)書著作權(quán)歸作者所有,本文已獲得作者授權(quán)轉(zhuǎn)載,并對(duì)原文進(jìn)行了重新的排版。Swoft...
摘要:和服務(wù)關(guān)系最密切的進(jìn)程是中的進(jìn)程組,絕大部分業(yè)務(wù)處理都在該進(jìn)程中進(jìn)行。隨后觸發(fā)一個(gè)事件各組件通過(guò)該事件進(jìn)行配置文件加載路由注冊(cè)。事件每個(gè)請(qǐng)求到來(lái)時(shí)僅僅會(huì)觸發(fā)事件。服務(wù)器生命周期和服務(wù)基本一致,詳情參考源碼剖析功能實(shí)現(xiàn) 作者:bromine鏈接:https://www.jianshu.com/p/4c0...來(lái)源:簡(jiǎn)書著作權(quán)歸作者所有,本文已獲得作者授權(quán)轉(zhuǎn)載,并對(duì)原文進(jìn)行了重新的排版。S...
摘要:作為定時(shí)任務(wù)的執(zhí)行者,通過(guò)每喚醒自身一次,然后把執(zhí)行表遍歷一次,挑選當(dāng)下需要執(zhí)行的任務(wù),通過(guò)投遞出去并更新該任務(wù)執(zhí)行表中的狀態(tài)。 作者:bromine鏈接:https://www.jianshu.com/p/b44...來(lái)源:簡(jiǎn)書著作權(quán)歸作者所有,本文已獲得作者授權(quán)轉(zhuǎn)載,并對(duì)原文進(jìn)行了重新的排版。Swoft Github: https://github.com/swoft-clou.....
摘要:中的注解注解是里面很多重要功能特別是,容器的基礎(chǔ)。主流的框架中使用的注解都是借用型注釋塊型注釋中的定義自己的注解機(jī)制。在中是注解信息的最終裝載容器。使用的信息構(gòu)造實(shí)例或獲取現(xiàn)有實(shí)例以上就是注解機(jī)制的整體實(shí)現(xiàn)了。源碼剖析系列目錄 作者:bromine鏈接:https://www.jianshu.com/p/ef7...來(lái)源:簡(jiǎn)書著作權(quán)歸作者所有,本文已獲得作者授權(quán)轉(zhuǎn)載,并對(duì)原文進(jìn)行了重新...
摘要:基于擴(kuò)展實(shí)現(xiàn)真正的數(shù)據(jù)庫(kù)連接池這種方案中,項(xiàng)目占用的連接數(shù)僅僅為。一種是連接暫時(shí)不再使用,其占用狀態(tài)解除,可以從使用者手中交回到空閑隊(duì)列中這種我們稱為連接的歸隊(duì)。源碼剖析系列目錄 作者:bromine鏈接:https://www.jianshu.com/p/1a7...來(lái)源:簡(jiǎn)書著作權(quán)歸作者所有,本文已獲得作者授權(quán)轉(zhuǎn)載,并對(duì)原文進(jìn)行了重新的排版。Swoft Github: https:...
閱讀 1813·2023-04-25 21:50
閱讀 2449·2019-08-30 15:53
閱讀 790·2019-08-30 13:19
閱讀 2774·2019-08-28 17:58
閱讀 2495·2019-08-23 16:21
閱讀 2730·2019-08-23 14:08
閱讀 1401·2019-08-23 11:32
閱讀 1469·2019-08-22 16:09