老李手把手教你寫山寨Workerman(一)

  • 2019 年 11 月 25 日
  • 筆記

逮噶吼,唔系勞李。

真的是萬萬沒想到,我竟然真的淪落到了用【XXX手把手教你XXX】當標題的一天…

先看一哈桑周投飄兒的結果撒,儂們先感受下撒:

  • swoole或者workerman相關內容 — 62票
  • 偏底層,主要是APUE、UNP方向 — 45票
  • 附近的人繼續繼續 — 33票
  • 高性能系列多寫下…雖然類似於第二個選項 — 47票
  • 除了PHP,多寫些其他的吧 — 21票
  • 老李你都個是老皮了,聊聊以後 — 35票

其實第二項和第四項可以合併一下的,既然要扯【高性能】就不能避開APUE或UNP里的基礎內容;不過讓我出於預料的是最後一項,竟然超越了【附近的人】系列穩居中等…這讓我稍微有點兒難堪;第一項預料之中…

所以就按照大家的意願,開個新坑系列,在正式開坑前,你們看下下面這一段我的分析推理,是不是合情合理…

關於Swoole和Workerman,我打算先寫點兒Workerman的事兒,WM結束後開始準備Swoole的內容 —> 如果說要寫點兒Workerman的事兒,你要說寫WM能幹啥用WM寫個聊天室啊啥的,也挺沒勁的,因為WM官網或者github上一大坨基於WM的項目 —> 那寫WM源碼分析?別鬧了,太枯燥了,干分析毛都分析不出來… —> 思慮來思慮去,不妨和大家一起參考WM然後一起手拉手山寨一個Workerman…

為了防止上綱上線,我們先喊下口號:

據坊間傳聞,Workerman是Walkor(李亮,我稱亮哥)之前在騰訊工作時受到某佬啟發後使用純PHP打造的一款Socket伺服器框架,我還聽說韓老師當時也在騰訊,但是他走了使用C語言實現PHP擴展的路子來實現Socket伺服器。這裡我再貼一個之前Walkor在V2發的一個帖子,帖子主要內容是詢問純PHP實現Socket可行性的,這個帖子十分有意思,我貼出來你們感受下:

https://www.v2ex.com/t/170206

我們先從較高的角度去拆解下WM的構成,拆解完成後,我們按照模組去逐步實現就可以了,這就是從零做一件比較繁雜事情的順序和方法,所以我想在此處佔用本文三分之一的空間來講個「小事情」。

你們還記得嗎?那還是1999年,有關部門(實際上最初是以個人名義)從二毛那裡買回了那艘建造度只有60%左右的瓦良格號,拖回來的路上經過博斯普魯斯海峽,被土耳其以某個借口強行扣留在了土耳其港口,之後便是長達近兩年的談判,據說當時土耳其張口要價10億美元後來有關部門經過談判,使用其他條件避開了這10億美元。所以前些年我聽到大街上飄過了一句類似於【想帶你去浪漫的土耳其】的歌詞時,心中真是五味雜陳…了解下土耳其建國歷史?扯遠了…

接著說瓦良格。瓦良格實際上是蘇聯庫茲涅佐夫號航母的姊妹艦,蘇聯分家後,庫茲涅佐夫號歸大毛,而瓦良格號歸二毛所有,可惜二毛沒有錢接著造完剩下的40%左右,所以他就一直停在港口等著發銹…當有關部門把瓦良格剛拖回來的時候,他是這個樣子的:

說句實話,那年年輕無知的我還是譏笑過TA的,至於那種陰陽怪氣的語氣你們應該能想像的到的,和微信群里一些人的語調還是十分相似的。這麼些年過去了,有關部門一直在忍受著這些無知的嘲諷和譏笑以及陰陽怪氣,他們開啟著寫輪眼沒日沒夜地研究學習復刻這樣一個龐大複雜的鐵疙瘩,學習分析源碼。

一個航母(後面是我瞎說胡說亂說的),從動力系統、航電系統、彈射系統、艦載機設計到各個模組的化學材料,幾乎每一項都是要考驗一個國家工業實力的。就舉個簡單的例子,前些年看到有媒體報道說共享單車浪費的鋼鐵能造多少航母,但凡xue微有點兒軍備常識的腿子們都應該知道,航母上的鋼可不是一般的鋼,這種鋼是考驗一個國家鋼鐵工業實力的!十幾年時間,有關部門就從零開始摸索航母上每個模組的設計與製造,這才有了今日我們看到的遼寧艦:

在將遼寧艦【源碼】按照模組級研究透徹後,用了短短几年時間,我們就擁有了TA:

上面聊遼寧艦的事情,就是想給大家說明這些點:

  • 聊聊如何從零開始折騰一個一大坨的項目,讀源碼拆分模組,分而治之,這才僅僅是第一步而已(研究WM)
  • 如果你真的認為你掌握了TA,你還需要再寫一個TA(山寨WM)
  • 完成上面兩點,需要相應的基礎知識(國家基礎工業能力)
  • 有時候還是要忍受一些嘲諷和譏笑的

我在這裡就簡單將WM按照模組拆解一下,從後面開始,我們將按照模組去逐漸實現我們的山寨WM:

  • 進程模型
  • IO模組
  • Event-Loop模組
  • 協議模組

希望你能多多少少具備一些下面的知識點,後面寫swoole相關內容會更加需要這些:

  • 多進程多執行緒
  • 進程間通訊
  • 訊號
  • Socket
  • TCP協議、UDP協議、HTTP協議

你們不是要底層、要APUE么?別給我整一出葉公好龍…