摘要:原文前面可以說(shuō)是弄了一系列的和多進(jìn)程的一大坨內(nèi)容,知識(shí)淺顯代碼粗暴風(fēng)格簡(jiǎn)陋,總的說(shuō)來(lái),還是差了一些細(xì)節(jié)。今天,就一些漏掉的細(xì)節(jié)補(bǔ)充一下。最后,我補(bǔ)充一句是同步的,而不是異步。
原文:https://t.ti-node.com/thread/...
前面可以說(shuō)是弄了一系列的php socket和多進(jìn)程的一大坨內(nèi)容,知識(shí)淺顯、代碼粗暴、風(fēng)格簡(jiǎn)陋,總的說(shuō)來(lái),還是差了一些細(xì)節(jié)。今天,就一些漏掉的細(xì)節(jié)補(bǔ)充一下。
一些有志青年可能最近手刃了Workerman源碼,對(duì)于里面那一大坨stream_select()、stream_socket_server()表示疑惑,這個(gè)玩意和socket_create、socket_set_nonblock()有啥區(qū)別?其實(shí),php官方手冊(cè)里也提到過(guò)一嘴,socket系函數(shù)就是基于BSD Socket那一套玩意搞的,幾乎就是將那些東西簡(jiǎn)單包裝了一下直接抄過(guò)來(lái)用的,抄到甚至連名字都和C語(yǔ)言操控socket的函數(shù)一模一樣,所以說(shuō)socket系函數(shù)是一種比較低級(jí)(Low-Level,這里的低級(jí)是指軟件工程中分層中層次的高低)socket操控方式,可以最大程度給你操作socket的自由以及細(xì)膩度。在php中,socket系本身是作為php擴(kuò)展而體現(xiàn)的,這個(gè)你可以通過(guò)php -m來(lái)查看有沒(méi)有socket,這件事情意味著有些php環(huán)境可能沒(méi)有安裝這個(gè)擴(kuò)展,這個(gè)時(shí)候你就無(wú)法使用socket系的函數(shù)了。但stream則不同了,這貨是內(nèi)建于php中的,除了能處理socket網(wǎng)絡(luò)IO外,還能操控普通文件的打開(kāi)寫(xiě)入讀取等,stream系將這些輸入輸出統(tǒng)一抽象成了流,通過(guò)流來(lái)對(duì)待一切。有人可能會(huì)問(wèn)二者性能上差距,但是本人沒(méi)有測(cè)試過(guò),這個(gè)我就不敢輕易妄言了,但是從正常邏輯上推演的話,應(yīng)該不會(huì)有什么太大差距之類的。
一定要分清楚監(jiān)聽(tīng)socket和連接socket,我們服務(wù)器監(jiān)聽(tīng)的是監(jiān)聽(tīng)socket,然后accept一個(gè)客戶端連接后的叫做連接socket。
關(guān)于“異步非阻塞”,這五個(gè)字到底體現(xiàn)在哪兒了。swoole我就不說(shuō)了,我源碼也才閱讀了一小部分,我就說(shuō)Workerman吧,它在github上稱:“Workerman is an asynchronous event driven PHP framework with high performance for easily building fast, scalable network applications.”,看到其中有asynchronous(異步)的字樣,打我臉的是我并沒(méi)有看到有non-block(非阻塞)的字樣,不過(guò)無(wú)妨,臉什么的不重要,重要的是我文章里那一坨又一坨的代碼里哪里體現(xiàn)了非阻塞、哪里體現(xiàn)了異步。來(lái)吧,看代碼吧。
看代碼前,你要理解異步和非阻塞的區(qū)別是什么,因?yàn)檫@二者在表現(xiàn)結(jié)果上看起來(lái)是有點(diǎn)兒相似的,如果你沒(méi)搞明白,那么一定要通過(guò)這個(gè)來(lái)理解一下《PHP socket初探 --- 關(guān)于IO的一些枯燥理論》。
將上面代碼保存了運(yùn)行一下,然后用telnet可以連接上去。但是,這段代碼中有兩處是阻塞的,最主要就是監(jiān)聽(tīng)socket是阻塞的。那么,非阻塞的監(jiān)聽(tīng)socket會(huì)是什么感受?
將代碼保存了運(yùn)行一下,告訴我:
來(lái)來(lái)來(lái),分析一波兒,為啥會(huì)出現(xiàn)這種現(xiàn)象。因?yàn)楸O(jiān)聽(tīng)socket被設(shè)置成了非阻塞,我們知道非阻塞就是程序立馬返回,然后再過(guò)段時(shí)間回來(lái)詢問(wèn),用例子就是“等饅頭過(guò)程中,看下微博,抬頭問(wèn)饅頭好了嗎?然后看下微信,抬頭問(wèn)饅頭好了嗎?然后看下v2ex,抬頭問(wèn)饅頭好了嗎?。。。 。。?!?,這樣你是不是就能理解了?因?yàn)椴](méi)有客戶端連接進(jìn)來(lái),所以每當(dāng)詢問(wèn)一次socket_accept后得到的反饋都是“沒(méi)有連接”,所以就直接走到“客戶端連接失敗”的分支中去了,而且是不斷的不停的。這個(gè)時(shí)候,你用htop或者top命令查看服務(wù)器CPU,不出意外應(yīng)該是100%,這是非阻塞的極大缺點(diǎn)。
緊接著是異步呢?異步體現(xiàn)在哪兒了?我們說(shuō)異步,是你去阿梅那里買(mǎi)饅頭,阿梅告訴你說(shuō)“饅頭還沒(méi)好,你去干別的吧,好了我打電話通知你”,然后你就專心去打游戲去了,直到電話響了你去拿饅頭。Workerman的異步更多是體現(xiàn)在對(duì)一個(gè)完整請(qǐng)求的處理流上,而不是正兒八經(jīng)的異步的定義概念,如果你沒(méi)聽(tīng)明白,那也可能正常,慢慢理解。最后,我補(bǔ)充一句:epoll是同步的,而不是異步。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/29669.html
摘要:原文地址正如標(biāo)題所言,顫顫抖抖開(kāi)篇。于是只能是你自己,把單子上的個(gè)快遞逐次和收到的對(duì)比一遍,然后對(duì)比完畢后再把這個(gè)單子給了阿梅,然后阿梅繼續(xù)等。剃光頭前的阿梅,就是,不敢正眼看老板娘一眼。剃光頭后的阿梅,就是,可徒手接魔鬼隊(duì)的死亡之球。 [原文地址:https://blog.ti-node.com/blog...] 正如標(biāo)題所言,顫顫抖抖開(kāi)篇epoll。顫顫抖抖的原因大概也就是以前幾乎...
摘要:原文地址在初探先從一個(gè)簡(jiǎn)單的服務(wù)器開(kāi)始中依次講解了三個(gè)逐漸進(jìn)步的服務(wù)器只能服務(wù)于一個(gè)客戶端的服務(wù)器利用可以服務(wù)于多個(gè)客戶端的額服務(wù)器利用預(yù)派生進(jìn)程服務(wù)于多個(gè)客戶端的服務(wù)器最后一種服務(wù)器的進(jìn)程模型基本上的大概原理其實(shí)跟我們常用的是非常 [原文地址:https://blog.ti-node.com/blog...] 在<PHP socket初探 --- 先從一個(gè)簡(jiǎn)單的socket服務(wù)器開(kāi)始...
摘要:原文地址要想更好了解編程,有一個(gè)不可繞過(guò)的環(huán)節(jié)就是在中,一切皆文件實(shí)際上要文件干啥不就是讀寫(xiě)么所以,這句話本質(zhì)就是才是王道用的打開(kāi)文件關(guān)閉文件讀讀寫(xiě)寫(xiě),這叫本地文件在編程中,本質(zhì)就是網(wǎng)絡(luò)所以,在開(kāi)始進(jìn)一步的編程前,我們必須先從概念上認(rèn)識(shí)好 [原文地址:https://blog.ti-node.com/blog...] 要想更好了解socket編程,有一個(gè)不可繞過(guò)的環(huán)節(jié)就是IO.在Lin...
摘要:類就是產(chǎn)生各種不同類型事件的產(chǎn)出器,比如定時(shí)器事件讀寫(xiě)事件等等,為了提升民族榮譽(yù)感,我們將這些各種事件比作各種戰(zhàn)斗機(jī)比如殲殲和殲。類就相對(duì)容易介入了,這玩意顯然就是一個(gè)航空母艦了,為了提升民族榮譽(yù)感,我們就把類當(dāng)作是遼寧艦。 [原文地址:https://blog.ti-node.com/blog...] 實(shí)際上php.net上是有event擴(kuò)展的使用說(shuō)明手冊(cè),但是呢,對(duì)于初學(xué)者來(lái)說(shuō)卻并...
摘要:原文地址的中文名字叫做套接字,這種東西就是對(duì)的封裝。運(yùn)行結(jié)果如下簡(jiǎn)單解析一下上述代碼來(lái)說(shuō)明一下服務(wù)器的流程首先,根據(jù)協(xié)議族或地址族套接字類型以及具體的的某個(gè)協(xié)議來(lái)創(chuàng)建一個(gè)。很容易受到攻擊,造成拒絕服務(wù)。 [原文地址:https://blog.ti-node.com/blog...] socket的中文名字叫做套接字,這種東西就是對(duì)TCP/IP的封裝。現(xiàn)實(shí)中的網(wǎng)絡(luò)實(shí)際上只有四層而已,從上...
閱讀 3152·2021-09-24 10:26
閱讀 3397·2021-09-23 11:54
閱讀 4788·2021-09-22 15:33
閱讀 2300·2021-09-09 09:33
閱讀 1731·2021-09-07 10:10
閱讀 1007·2019-08-30 11:09
閱讀 2905·2019-08-29 17:13
閱讀 1065·2019-08-29 12:35