Swoole學(xué)習(xí)筆記(一):架構(gòu)概述

swoole雖然是標(biāo)準(zhǔn)的PHP擴(kuò)展,實(shí)際上與普通的擴(kuò)展不同。普通的擴(kuò)展只是提供一個(gè)庫(kù)函數(shù)。而swoole擴(kuò)展在運(yùn)行后會(huì)接管PHP的控制權(quán),進(jìn)入事件循環(huán)。
在swoole中,有一個(gè)master進(jìn)程(父進(jìn)程)和多個(gè)worker進(jìn)程(子進(jìn)程),這個(gè)和nginx,fpm屬于同一種模型。

創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供珠暉網(wǎng)站建設(shè)、珠暉做網(wǎng)站、珠暉網(wǎng)站設(shè)計(jì)、珠暉網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、珠暉企業(yè)網(wǎng)站模板建站服務(wù),10年珠暉做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

1.進(jìn)程和子進(jìn)程
關(guān)于進(jìn)程的概念不多贅述,進(jìn)程中最重要的兩個(gè)部分,一是內(nèi)存:包括堆棧,各種變量等等;二是上下文切換,如操作系統(tǒng)資源、信號(hào)量和自身狀態(tài)等等;
子進(jìn)程由父進(jìn)程創(chuàng)建,但是子進(jìn)程擁有獨(dú)立的內(nèi)存和上下文環(huán)境:
1)子進(jìn)程會(huì)復(fù)制父進(jìn)程的內(nèi)存空間和上下文環(huán)境。注意,這里是復(fù)制,并不是共享內(nèi)存,這和線程是不同的。
2)修改某個(gè)子進(jìn)程的內(nèi)存空間,不會(huì)修改父進(jìn)程或其他子進(jìn)程中的內(nèi)存空間;
3)子進(jìn)程會(huì)復(fù)制父進(jìn)程的IO句柄(fd描述符);

2.進(jìn)程間的通訊方式
進(jìn)程之間常見的通訊方式如下:
1)管道pipe:管道是一種半雙工的通信方式,數(shù)據(jù)只能單向流動(dòng),而且只能在具有親緣關(guān)系的進(jìn)程間使用。進(jìn)程的親緣關(guān)系通常是指父子進(jìn)程關(guān)系。
2)命名管道FIFO:有名管道也是半雙工的通信方式,但是它允許無親緣關(guān)系進(jìn)程間的通信。
3)消息隊(duì)列MessageQueue:消息隊(duì)列是由消息的鏈表,存放在內(nèi)核中并由消息隊(duì)列標(biāo)識(shí)符標(biāo)識(shí)。消息隊(duì)列克服了信號(hào)傳遞信息少、管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等缺點(diǎn)。
4)共享存儲(chǔ)SharedMemory:共享內(nèi)存就是映射一段能被其他進(jìn)程所訪問的內(nèi)存,這段共享內(nèi)存由一個(gè)進(jìn)程創(chuàng)建,但多個(gè)進(jìn)程都可以訪問。共享內(nèi)存是最快的 IPC 方式,它是針對(duì)其他進(jìn)程間通信方式運(yùn)行效率低而專門設(shè)計(jì)的。它往往與其他通信機(jī)制,如信號(hào)兩,配合使用,來實(shí)現(xiàn)進(jìn)程間的同步和通信。
5)信號(hào)量Semaphore:信號(hào)量是一個(gè)計(jì)數(shù)器,可以用來控制多個(gè)進(jìn)程對(duì)共享資源的訪問。它常作為一種鎖機(jī)制,防止某進(jìn)程正在訪問共享資源時(shí),其他進(jìn)程也訪問該資源。因此,主要作為進(jìn)程間以及同一進(jìn)程內(nèi)不同線程之間的同步手段。
6)套接字Socket:套解口也是一種進(jìn)程間通信機(jī)制,與其他通信機(jī)制不同的是,它可用于不同及其間的進(jìn)程通信。
7)信號(hào) ( sinal ) : 信號(hào)是一種比較復(fù)雜的通信方式,用于通知接收進(jìn)程某個(gè)事件已經(jīng)發(fā)生。
在swoole中,子進(jìn)程間的通訊是通過共享內(nèi)存實(shí)現(xiàn)的:
Swoole學(xué)習(xí)筆記(一):架構(gòu)概述
共享內(nèi)存具有如下的特點(diǎn):
共享內(nèi)存不屬于任何一個(gè)進(jìn)程;
共享內(nèi)存中分配的內(nèi)存可以被任何進(jìn)程訪問,只要有這塊共享內(nèi)存的key值就好;
即使進(jìn)程退出,共享內(nèi)存仍然可以技術(shù)保留;

3.swoole的整體架構(gòu)
swoole的整體架構(gòu)如下:
Swoole學(xué)習(xí)筆記(一):架構(gòu)概述
swoole中進(jìn)程間的通信是通過管道實(shí)現(xiàn)的。
1) master用來處理swoole核心的事件驅(qū)動(dòng)
Main Reactor:總線程,負(fù)責(zé)線程任何調(diào)度
Reactor:線程,每一個(gè)子線程包含一個(gè)epoll實(shí)例的實(shí)現(xiàn)
2) manager
負(fù)責(zé)管理,不會(huì)運(yùn)行任何用戶層的業(yè)務(wù)邏輯,只負(fù)責(zé)進(jìn)程的管理和分配
3) worker
主邏輯進(jìn)程,處理來自客戶端的請(qǐng)求
當(dāng)woker進(jìn)程被關(guān)閉,manager會(huì)重新拉起一個(gè)進(jìn)程,保證woker的總數(shù)量
4) task
異步工作進(jìn)程,處理耗時(shí)較長(zhǎng)的任務(wù)

4.task與woker
task與woker之間是通過unix Sock管道進(jìn)行通訊的,也可以通過消息隊(duì)列進(jìn)行實(shí)現(xiàn)
Swoole學(xué)習(xí)筆記(一):架構(gòu)概述
1.Task傳遞數(shù)據(jù)大小
數(shù)據(jù)小于8K,直接通過管道傳遞,數(shù)據(jù)大于8K,寫入臨時(shí)文件傳遞
2.Task傳遞對(duì)象
可以通過序列化傳遞一個(gè)對(duì)象的拷貝;
Task中對(duì)對(duì)象的改變不會(huì)反映到Worker進(jìn)程中;
數(shù)據(jù)庫(kù)連接,網(wǎng)絡(luò)連接對(duì)象不可以傳遞。
3.Task的onFinish回調(diào)
Task的onFinish回調(diào)會(huì)發(fā)回調(diào)用task方法的Worker進(jìn)程(投遞者)

5.timer定時(shí)器
timer定時(shí)器用來替代crontab,來實(shí)現(xiàn)一個(gè)精度更高(毫秒級(jí)別)的定時(shí)器;
在1.7.x之前,timer是一個(gè)線程,這個(gè)線程會(huì)在一定的間隔喚醒,來檢查各個(gè)定時(shí)器是否能夠使用
這種方式有以下兩個(gè)問題:
1)創(chuàng)建的定時(shí)器的數(shù)量有限,本輪還沒循環(huán)完,下輪就又開始了;
2)容錯(cuò)性小,線程掛掉,整個(gè)定時(shí)器任務(wù)失效;

新版swoole采用注冊(cè)一個(gè)epoll函數(shù),如果超過timeout,這個(gè)函數(shù)會(huì)返回,去回調(diào)指定函數(shù),檢查內(nèi)存中是否有可用的定時(shí)器
使用最小堆,存放timer

當(dāng)前名稱:Swoole學(xué)習(xí)筆記(一):架構(gòu)概述
文章鏈接:http://bm7419.com/article24/iihice.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計(jì)、標(biāo)簽優(yōu)化、網(wǎng)站設(shè)計(jì)虛擬主機(jī)、做網(wǎng)站靜態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化