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