成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

PHP socket初探 --- 顫顫抖抖開(kāi)篇libevent(一)

levinit / 826人閱讀

摘要:原文地址正如標(biāo)題所言,顫顫抖抖開(kāi)篇。于是只能是你自己,把單子上的個(gè)快遞逐次和收到的對(duì)比一遍,然后對(duì)比完畢后再把這個(gè)單子給了阿梅,然后阿梅繼續(xù)等。剃光頭前的阿梅,就是,不敢正眼看老板娘一眼。剃光頭后的阿梅,就是,可徒手接魔鬼隊(duì)的死亡之球。

[原文地址:https://blog.ti-node.com/blog...]

正如標(biāo)題所言,顫顫抖抖開(kāi)篇epoll。顫顫抖抖的原因大概也就是以前幾乎沒(méi)有親自“手刃”epoll的經(jīng)驗(yàn),僅僅靠epoll的理論知識(shí)騙吃騙喝騙人事哄小孩兒裝高手,現(xiàn)如今,沒(méi)有了大師兄的鐵頭功照顧,沒(méi)有了六師弟的輕功水上漂背,沒(méi)有了阿梅的太極功護(hù)身,不得不自己個(gè)兒當(dāng)一次排頭兵了。

說(shuō)到底,還是因?yàn)樽约禾摗?/strong>

先立個(gè)flag,那就是epoll比select牛逼,盡管select是POSIX標(biāo)準(zhǔn)。即便是select的高配版本poll,也比epoll差太多太多。網(wǎng)絡(luò)如此發(fā)達(dá)的今天,epoll是解決c10k問(wèn)題的功臣,這是沒(méi)有辦法的事情。epoll雖然是后出生的,但是卻有著與生俱來(lái)的高傲,就像王思聰;select就是普通屌絲,花點(diǎn)兒錢(qián)使勁裝扮自己也頂多就是個(gè)poll。這poll和epoll,可差一個(gè)e呢,沒(méi)辦法,與生俱來(lái)的差距。

坊間傳聞,在epoll出世前,QQ用戶量劇增,但是select以及select的高配版本poll都無(wú)法解決他們的問(wèn)題,于是乎QQ當(dāng)年的服務(wù)器就不得不用UDP協(xié)議來(lái)避規(guī)這個(gè)問(wèn)題,一直到后來(lái)有了epoll,QQ開(kāi)始逐步在PC客戶端中的配置項(xiàng)中允許用戶選擇UDP服務(wù)器或TCP服務(wù)器。

還是通過(guò)淺顯的示例來(lái)說(shuō)明下為啥epoll比select厲害(這個(gè)例子在前面文章中應(yīng)該提過(guò),今兒再回放一遍)。

你要去繼續(xù)練習(xí)大力金剛腿,阿梅還是要替你收雙十一的10個(gè)快遞。為了方便自己記憶這些快遞,你把十個(gè)快遞記錄到了一個(gè)清單上給了阿梅。但這個(gè)時(shí)候阿梅顯然不太清楚怎么應(yīng)付這場(chǎng)景,于是每當(dāng)收到X個(gè)快遞,阿梅都是直接把快遞清單抄寫(xiě)一份再拿給你并告訴你:“有快遞來(lái)了!”,至于來(lái)了幾個(gè)快遞以及是分別是哪個(gè)鏢局護(hù)送的,阿梅是不會(huì)告訴你的。于是只能是你自己,把單子上的10個(gè)快遞逐次和收到的對(duì)比一遍,然后對(duì)比完畢后再把這個(gè)單子給了阿梅,然后阿梅繼續(xù)等。

又是一年雙十一,阿梅這次學(xué)聰明了,經(jīng)歷過(guò)那場(chǎng)球賽后,她已經(jīng)得到了自我,實(shí)現(xiàn)了人生價(jià)值,今年的阿梅是一個(gè)全新的阿梅,一個(gè)剃了光頭的阿梅。

你要去繼續(xù)練習(xí)大力金剛腿,阿梅還是要替你收雙十一的10個(gè)快遞。為了方便自己記憶這些快遞,你把十個(gè)快遞記錄到了一個(gè)清單上給了阿梅。但這個(gè)時(shí)候的阿梅顯然已經(jīng)得到了自我,是升華了的阿梅,于是每收到X個(gè)( X >= 1 )快遞,阿梅都會(huì)在沖你喊一句:“順豐鏢局大師兄的鐵頭套,圓通鏢局六師弟的雞蛋到了!”,而你,不用再去依次對(duì)單子,阿梅會(huì)直接告訴你是哪個(gè)鏢局護(hù)送的哪個(gè)快遞,然后她還會(huì)按照你提前告訴她的“如果收到雞蛋就給六師弟,收到鐵頭套就給大師兄”。哪怕你買(mǎi)了10000個(gè)快遞,阿梅照樣四兩撥千斤,太極功夫收快遞,而你,只需要安靜的練習(xí)大力金剛腿。

剃光頭前的阿梅,就是select,不敢正眼看老板娘一眼。
剃光頭后的阿梅,就是epoll,可徒手接魔鬼隊(duì)的死亡之球。

快遞就相當(dāng)于是socket fd,包括監(jiān)聽(tīng)socket和連接socket;那個(gè)清單就是fd的集合;阿梅就是select或者epoll;你就是當(dāng)前的一個(gè)進(jìn)程;某個(gè)快遞到了,就相當(dāng)于是某個(gè)fd已經(jīng)可讀或可寫(xiě)。

select雖然一定程度上解決了一個(gè)進(jìn)程可以讀寫(xiě)多個(gè)fd的問(wèn)題,但是select有如下致命缺點(diǎn):

默認(rèn)情況下,select可管理的fd的數(shù)量是1024個(gè)(阿梅最多幫你收1024個(gè)快遞)

select每次檢測(cè)到fd集合中有可讀寫(xiě)的fd時(shí),它會(huì)把整個(gè)fd全部復(fù)制一遍給你,然后你自己再去逐個(gè)輪詢究竟是哪個(gè)fd可讀寫(xiě)

正如以上所說(shuō),它會(huì)把整個(gè)fd全部復(fù)制給你(她把整個(gè)清單抄了一份給你),從術(shù)語(yǔ)上講,這個(gè)過(guò)程是將fd從內(nèi)核態(tài)復(fù)制一遍給用戶態(tài)的調(diào)用進(jìn)程

正如以上所說(shuō),你自己逐個(gè)輪詢所有fd才能知道究竟是哪個(gè)可讀寫(xiě)(反正就是有快遞來(lái)了,來(lái)了幾個(gè)都是誰(shuí)你自己個(gè)兒對(duì)著清單查去)

你自己個(gè)輪詢的過(guò)程是線性的,如果有個(gè)n個(gè)fd,那么時(shí)間復(fù)雜度一定是O(n)

而epoll則擁有更加專業(yè)的高端大氣上檔次的技能指標(biāo):

理論上可以搞定無(wú)上限的fd(可以收無(wú)數(shù)個(gè)快遞的阿梅)

只挑出可讀寫(xiě)(其實(shí)嚴(yán)格意義上還有異常)的活躍的fd,其余的fd不理會(huì)

使用MMAP加速內(nèi)核態(tài)數(shù)據(jù)拷貝

除此之外,需要特殊指出的是,epoll本身的兩種模式:

水平觸發(fā)。這種方式下,如果監(jiān)聽(tīng)到了有X個(gè)事件發(fā)生,那么內(nèi)核態(tài)會(huì)將這些事件拷貝到用戶態(tài),但是可惜的是,如果用戶只處理了其中一件,剩余的X-1件出于某種原因并沒(méi)有理會(huì),那么下次的時(shí)候,這些未處理完的X-1個(gè)事件依然會(huì)從內(nèi)核態(tài)拷貝到用戶態(tài)。這樣做是有陰陽(yáng)兩面的,陽(yáng)面是事件安全的不會(huì)發(fā)生丟失,陰面是對(duì)于性能來(lái)說(shuō)是一種浪費(fèi)。其實(shí)這個(gè)時(shí)候的epoll頗有些類似于poll的工作方式。

邊緣觸發(fā)。這種方式下,是雞血版本的epoll,是釋放自我的epoll,也是應(yīng)該是正確的使用方式。這種情況下,如果發(fā)生了X個(gè)事件,然而你只處理了其中1個(gè)事件,那么剩余的X-1個(gè)事件就算“丟失”了。性能是上去了,與之俱來(lái)的就是可能的事件丟失。

那么,你以為是時(shí)候?qū)懘a演示epoll了,然而并不是,原因有兩個(gè):

通過(guò)C語(yǔ)言可以直接操作epoll,但是,為了避免裝逼失敗,我決定不用C來(lái)演示(放到后面再深入的時(shí)候)

如果說(shuō)通過(guò)PHP來(lái)操作,我不得不提一件悲催的事情,據(jù)我自己得到的經(jīng)驗(yàn)告訴我 那就是PHP無(wú)法直接操控epoll,而是要通過(guò)操作libevent來(lái)搞定epoll。

那么,什么是Libevent呢?怎么聽(tīng)著好耳熟,不光耳熟,你看下下圖,是不是還有點(diǎn)兒眼熟?沒(méi)錯(cuò),這的博客的前端頁(yè)面就是抄的Libevent官網(wǎng)的。

我先從Libevent官網(wǎng)抄襲一段話:“Currently, libevent supports /dev/poll, kqueue(2), event ports, POSIX select(2), Windows select(), poll(2), and epoll(4). ”,你就能大概知道Libevent是干啥的了。大概意思就是Libevent對(duì)/dev/poll、Mac中的kqueue、select、poll以及epoll的API進(jìn)行了封裝,屏蔽了這幾個(gè)多路復(fù)用開(kāi)發(fā)上的一些細(xì)節(jié)和不同點(diǎn),對(duì)外提供統(tǒng)一的API的一個(gè)高性能網(wǎng)絡(luò)事件庫(kù)。

額外提醒一點(diǎn),這個(gè)東西是用C語(yǔ)言編寫(xiě)的,幾十年過(guò)去了,你大爺還是你大爺。

回到正路上來(lái),就是“PHP中如何使用Libevent”。在pecl.php.net上,有兩個(gè)擴(kuò)展都可以使phper方便地操控libevent,一個(gè)就叫l(wèi)ibevent,另一個(gè)叫做event,推薦大家用后者。前者不知道什么原因版本一直停留在0.10 Beta狀態(tài),開(kāi)發(fā)日期則停留在了2013-05-22日,我沒(méi)怎么試過(guò),估計(jì)可能不支持php7,不過(guò),還是要感謝開(kāi)發(fā)者。event擴(kuò)展就比較屌了,版本迭代不錯(cuò),看起來(lái)開(kāi)發(fā)者挺積極的,也支持php7,目前的穩(wěn)定版本是2.3.0,所以推薦大家使用event擴(kuò)展。

正好在此補(bǔ)充一下php擴(kuò)展的安裝方式,以event擴(kuò)展為例。

下載event 2.3.0的穩(wěn)定版本,wget https://pecl.php.net/get/even...

解壓tgz源碼包,tar -zxvf event-2.3.0.tgz

cd event-2.3.0進(jìn)入到主目錄中,然后執(zhí)行phpize,再執(zhí)行./configure

執(zhí)行make

執(zhí)行make install安裝

配置php的cli環(huán)境配置文件,注意不是apache2,也不是fpm的,而是cli的php.ini,添加一句:extension = "/usr/lib/php/20151012/event.so",然后在終端中執(zhí)行php -m看下,是不是有event呢?

好了,今天到這里正式收官,下一篇繼續(xù)嗑php和他的event擴(kuò)展二三事!

[原文地址:https://blog.ti-node.com/blog...]

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/29384.html

相關(guān)文章

  • PHP socket初探 --- 含著淚也要磕完libevent(三)

    摘要:無(wú)數(shù)個(gè)專業(yè)送給啦啦啦啦,開(kāi)始碼注意,將監(jiān)聽(tīng)設(shè)置為非阻塞模式這里值得注意,我們聲明兩個(gè)數(shù)組用來(lái)保存事件和連接歡迎來(lái)到聊天室發(fā)言注意遵守當(dāng)?shù)胤煞ㄒ?guī)使用全局的和非阻塞模式下,注意的寫(xiě)法會(huì)稍微特殊一些。 原文地址:https://t.ti-node.com/thread/... 這段時(shí)間相比大家也看到了,本人離職了,一是在家偷懶實(shí)在懶得動(dòng)手,二是好不容易想寫(xiě)點(diǎn)兒時(shí)間全部砸到數(shù)據(jù)結(jié)構(gòu)和算法那里...

    suxier 評(píng)論0 收藏0
  • PHP socket初探 --- 硬著頭皮繼續(xù)libevent(二)

    摘要:類就是產(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ō)卻并...

    jokester 評(píng)論0 收藏0
  • PHP多進(jìn)程初探 --- 開(kāi)篇

    摘要:所以我們只說(shuō)的多進(jìn)程,至于多線程就暫時(shí)放到一邊兒。出來(lái)新進(jìn)程則成為子進(jìn)程,原進(jìn)程則成為父進(jìn)程,子進(jìn)程擁有父進(jìn)程的副本。在父進(jìn)程中返回子進(jìn)程的進(jìn)程,在子進(jìn)程內(nèi)部本身返回?cái)?shù)字。 [原文地址:https://blog.ti-node.com/blog...] 實(shí)際上PHP是有多線程的,只是很多人不常用。使用PHP的多線程首先需要下載安裝一個(gè)線程安全版本(ZTS版本)的PHP,然后再安裝pec...

    wh469012917 評(píng)論0 收藏0
  • PHP socket初探 --- 些零碎細(xì)節(jié)的拾漏補(bǔ)缺

    摘要:原文前面可以說(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é)。今天,就一些漏...

    chengjianhua 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<