[原文地址:https://blog.ti-node.com/blog...]php
正如標題所言,顫顫抖抖開篇epoll。顫顫抖抖的緣由大概也就是之前幾乎沒有親自「手刃」epoll的經驗,僅僅靠epoll的理論知識騙吃騙喝騙人事哄小孩兒裝高手,現現在,沒有了大師兄的鐵頭功照顧,沒有了六師弟的輕功水上漂背,沒有了阿梅的太極功護身,不得不本身個兒當一次排頭兵了。前端
先立個flag,那就是epoll比select牛逼,儘管select是POSIX標準。即使是select的高配版本poll,也比epoll差太多太多。網絡如此發達的今天,epoll是解決c10k問題的功臣,這是沒有辦法的事情。epoll雖然是後出生的,可是卻有着與生俱來的高傲,就像王思聰;select就是普通屌絲,花點兒錢使勁裝扮本身也頂多就是個poll。這poll和epoll,可差一個e呢,沒辦法,與生俱來的差距。node
坊間傳聞,在epoll出世前,QQ用戶量劇增,可是select以及select的高配版本poll都沒法解決他們的問題,因而乎QQ當年的服務器就不得不用UDP協議來避規這個問題,一直到後來有了epoll,QQ開始逐步在PC客戶端中的配置項中容許用戶選擇UDP服務器或TCP服務器。apache
仍是經過淺顯的示例來講明下爲啥epoll比select厲害(這個例子在前面文章中應該提過,今兒再回放一遍)。安全
你要去繼續練習大力金剛腿,阿梅仍是要替你收雙十一的10個快遞。爲了方便本身記憶這些快遞,你把十個快遞記錄到了一個清單上給了阿梅。但這個時候阿梅顯然不太清楚怎麼應付這場景,因而每當收到X個快遞,阿梅都是直接把快遞清單抄寫一份再拿給你並告訴你:「有快遞來了!」,至於來了幾個快遞以及是分別是哪一個鏢局護送的,阿梅是不會告訴你的。因而只能是你本身,把單子上的10個快遞逐次和收到的對比一遍,而後對比完畢後再把這個單子給了阿梅,而後阿梅繼續等。服務器
又是一年雙十一,阿梅此次學聰明瞭,經歷過那場球賽後,她已經獲得了自我,實現了人生價值,今年的阿梅是一個全新的阿梅,一個剃了光頭的阿梅。網絡
你要去繼續練習大力金剛腿,阿梅仍是要替你收雙十一的10個快遞。爲了方便本身記憶這些快遞,你把十個快遞記錄到了一個清單上給了阿梅。但這個時候的阿梅顯然已經獲得了自我,是昇華了的阿梅,因而每收到X個( X >= 1 )快遞,阿梅都會在衝你喊一句:「順豐鏢局大師兄的鐵頭套,圓通鏢局六師弟的雞蛋到了!」,而你,不用再去依次對單子,阿梅會直接告訴你是哪一個鏢局護送的哪一個快遞,而後她還會按照你提早告訴她的「若是收到雞蛋就給六師弟,收到鐵頭套就給大師兄」。哪怕你買了10000個快遞,阿梅照樣四兩撥千斤,太極功夫收快遞,而你,只須要安靜的練習大力金剛腿。php7
剃光頭前的阿梅,就是select,不敢正眼看老闆娘一眼。
剃光頭後的阿梅,就是epoll,可徒手接魔鬼隊的死亡之球。socket
快遞就至關因而socket fd,包括監聽socket和鏈接socket;那個清單就是fd的集合;阿梅就是select或者epoll;你就是當前的一個進程;某個快遞到了,就至關因而某個fd已經可讀或可寫。性能
select雖然必定程度上解決了一個進程能夠讀寫多個fd的問題,可是select有以下致命缺點:
而epoll則擁有更加專業的高端大氣上檔次的技能指標:
除此以外,須要特殊指出的是,epoll自己的兩種模式:
那麼,你覺得是時候寫代碼演示epoll了,然而並非,緣由有兩個:
那麼,什麼是Libevent呢?怎麼聽着好耳熟,不光耳熟,你看下下圖,是否是還有點兒眼熟?沒錯,這的博客的前端頁面就是抄的Libevent官網的。
我先從Libevent官網抄襲一段話:「Currently, libevent supports /dev/poll, kqueue(2), event ports, POSIX select(2), Windows select(), poll(2), and epoll(4). 」,你就能大概知道Libevent是幹啥的了。大概意思就是Libevent對/dev/poll、Mac中的kqueue、select、poll以及epoll的API進行了封裝,屏蔽了這幾個多路複用開發上的一些細節和不一樣點,對外提供統一的API的一個高性能網絡事件庫。
額外提醒一點,這個東西是用C語言編寫的,幾十年過去了,你大爺仍是你大爺。
回到正路上來,就是「PHP中如何使用Libevent」。在pecl.php.net上,有兩個擴展均可以使phper方便地操控libevent,一個就叫libevent,另外一個叫作event,推薦你們用後者。前者不知道什麼緣由版本一直停留在0.10 Beta狀態,開發日期則停留在了2013-05-22日,我沒怎麼試過,估計可能不支持php7,不過,仍是要感謝開發者。event擴展就比較屌了,版本迭代不錯,看起來開發者挺積極的,也支持php7,目前的穩定版本是2.3.0,因此推薦你們使用event擴展。
正好在此補充一下php擴展的安裝方式,以event擴展爲例。