黄p网站_在线看中文字幕_亚洲电影免费观看_成人激情视频_欧美成视频_中国av在线

Swoole的生命周期


php-fpm中的生命周期


傳統(tǒng)基于php-fpm的web開發(fā)通常淡化了全局期變量的影響,這對(duì)于開發(fā)者而言,顯然是降低了許多上手難度的;但也導(dǎo)致了許多新人對(duì)全局期變量會(huì)產(chǎn)生的影響沒有深刻理解。

我們知道,php-fpm收到請(qǐng)求后會(huì)分配一個(gè)work進(jìn)程去處理這條請(qǐng)求,而work會(huì)去讀取并執(zhí)行.php文件(在通常情基于框架的開發(fā)中,這個(gè).php文件可能是index.php)。也就是說在傳統(tǒng)模式中,每個(gè)請(qǐng)求都是獨(dú)立在自己的進(jìn)程中執(zhí)行的,因?yàn)檫M(jìn)程是隔離的而php-fpm又是同步阻塞的,所以我們可以很好的清楚和了解是誰在什么時(shí)候創(chuàng)建了變量、修改了變量、銷毀了變量。

簡(jiǎn)單舉個(gè)例子

可可醬是商店的一名售貨員,這個(gè)店只有他一個(gè)人。當(dāng)客戶來了之后需要購買一瓶可樂,可可醬檢查了貨架確認(rèn)有可樂,隨后告訴客戶這瓶可樂價(jià)格是¥3.5元,客戶付錢給可可醬,可可醬收到錢后把可樂交給了客戶。

后來發(fā)現(xiàn)客人太多,只有可可醬一個(gè)人的時(shí)候后面的客戶需要排隊(duì)很久,于是老板決定再雇一名售貨員,于是加入了小明。

還是上面的場(chǎng)景,但是由于小明的加入,小明和可可醬同時(shí)接待了2名客戶,可可醬檢查了貨架確認(rèn)還有一箱可樂的時(shí)候,和客人溝通可樂的價(jià)格時(shí),小明的客戶需要購買一箱可樂,于是小明就取走了一箱可樂,當(dāng)可可醬收了錢準(zhǔn)備拿可樂的時(shí)候,發(fā)現(xiàn)沒有可樂了,然后被客戶打了一頓。

在上面的場(chǎng)景中,就是一個(gè)變量被修改而導(dǎo)致后續(xù)邏輯混亂的場(chǎng)景,在傳統(tǒng)的fpm開發(fā)中,往往只會(huì)在訪問數(shù)據(jù)庫的時(shí)候出現(xiàn)這種場(chǎng)景。但是如果假設(shè)一個(gè)fpm進(jìn)程可以同時(shí)處理多條請(qǐng)求的時(shí)候,你如果將用戶信息存放在全局變量中,那么你就無法再可靠的判斷當(dāng)前用戶是誰了。

swoole_server中對(duì)象的4層生命周期


以下內(nèi)容摘自swoole文檔

開發(fā)swoole程序與普通LAMP下編程有本質(zhì)區(qū)別。在傳統(tǒng)的Web編程中,PHP程序員只需要關(guān)注request到達(dá),request結(jié)束即可。而在swoole程序中程序員可以操控更大范圍,變量/對(duì)象可以有四種生存周期。

變量、對(duì)象、資源、require/include的文件等下面統(tǒng)稱為對(duì)象

程序全局期

swoole_server->start之前就創(chuàng)建好的對(duì)象,我們稱之為程序全局生命周期。這些變量在程序啟動(dòng)后就會(huì)一直存在,直到整個(gè)程序結(jié)束運(yùn)行才會(huì)銷毀。

有一些服務(wù)器程序可能會(huì)連續(xù)運(yùn)行數(shù)月甚至數(shù)年才會(huì)關(guān)閉/重啟,那么程序全局期的對(duì)象在這段時(shí)間持續(xù)駐留在內(nèi)存中的。程序全局對(duì)象所占用的內(nèi)存是Worker進(jìn)程間共享的,不會(huì)額外占用內(nèi)存。

這部分內(nèi)存會(huì)在寫時(shí)分離(COW),在Worker進(jìn)程內(nèi)對(duì)這些對(duì)象進(jìn)行寫操作時(shí),會(huì)自動(dòng)從共享內(nèi)存中分離,變?yōu)?strong>進(jìn)程全局對(duì)象。

程序全局期include/require的代碼,必須在整個(gè)程序shutdown時(shí)才會(huì)釋放,reload無效

進(jìn)程全局期

swoole擁有進(jìn)程生命周期控制的機(jī)制,一個(gè)Worker子進(jìn)程處理的請(qǐng)求數(shù)超過max_request配置后,就會(huì)自動(dòng)銷毀。Worker進(jìn)程啟動(dòng)后創(chuàng)建的對(duì)象(onWorkerStart中創(chuàng)建的對(duì)象),在這個(gè)子進(jìn)程存活周期之內(nèi),是常駐內(nèi)存的。onConnect/onReceive/onClose 中都可以去訪問它。

進(jìn)程全局對(duì)象所占用的內(nèi)存是在當(dāng)前子進(jìn)程內(nèi)存堆的,并非共享內(nèi)存。對(duì)此對(duì)象的修改僅在當(dāng)前Worker進(jìn)程中有效
進(jìn)程期include/require的文件,在reload后就會(huì)重新加載

會(huì)話期

onConnectonClose是一次TCP的會(huì)話周期,http keep-alive時(shí),一個(gè)連接可能會(huì)有多個(gè)request。 http是無狀態(tài)的,一個(gè)用戶可能也不止一個(gè)連接,可以通過創(chuàng)建一個(gè)session來關(guān)聯(lián)同一個(gè)用戶的不同請(qǐng)求。

請(qǐng)求期

請(qǐng)求期就是指一個(gè)完整的請(qǐng)求發(fā)來,也就是onReceive收到請(qǐng)求開始處理,直到返回結(jié)果發(fā)送response。這個(gè)周期所創(chuàng)建的對(duì)象,會(huì)在請(qǐng)求完成后銷毀。

swoole中請(qǐng)求期對(duì)象與普通PHP程序中的對(duì)象就是一樣的。請(qǐng)求到來時(shí)創(chuàng)建,請(qǐng)求結(jié)束后銷毀。

總結(jié)


在Swoole中,一個(gè)work進(jìn)程處理完請(qǐng)求后并不會(huì)銷毀(甚至可能同時(shí)處理多個(gè)請(qǐng)求),所以務(wù)必要明確你創(chuàng)建的變量的生命周期,以防止出現(xiàn)邏輯上的問題。

主站蜘蛛池模板: 91精品国产色综合久久不卡98口 | 九九免费视频 | www一起操| 成人免费aaa | 国产精品久久一区 | 午夜精品久久久久久久 | 国产精品国产 | av资源中文在线天堂 | 亚洲专区欧美 | 中文二区 | 99久久精品免费看国产免费软件 | 久久久久久久久一区二区 | 激情图区在线观看 | 国产九九在线观看 | 国产精品亚洲一区二区三区 | 国产精品久久久久永久免费观看 | 国产高清一区二区三区 | 超碰综合 | 一区视频网站 | 国产一区二区视频免费 | 久久精品首页 | 亚洲国产成人精品久久 | 亚洲男人天堂2023 | 成人a在线视频免费观看 | 国产精品一二区 | 精品九九九 | 国产一区二区久久 | 午夜日韩在线观看 | 精品自拍视频 | 伊人久久综合 | 中文字幕一区在线观看视频 | 日本在线免费电影 | 久在线观看 | 久久69精品久久久久久久电影好 | 亚洲精品成人a8198a | 久久精品91| 午夜午夜精品一区二区三区文 | 久久99久 | 精品中文字幕在线观看 | 欧美一区久久 | 一区二区三区视频在线 |