Gavin 發(fā)了幾個workerman改進意見,這里記錄下
發(fā)幾個關(guān)于workerman的意見
一 沒有主進程啟動與結(jié)束回調(diào)
這兩個回調(diào)的一個用途是用于與外部工具協(xié)作,例如服務(wù)發(fā)現(xiàn)。主要是方便在
在runAll前執(zhí)行啟動是不可取的,因為此時workerman的資源尚未載入,一些可能需要獲取的信息尚未生成。
在register_shutdown_function或者在onWorkerStop進行結(jié)束回調(diào)也是不可取的,workerman并未提供方法判斷當前進程是主進程還是worker進程。
二 注冊回調(diào)函數(shù)的方式并不好
這個屬于見仁見智,但主流做法是使用on($event, callable $callback)進行注冊,我也更傾向于這個做法,包裝起來更方便。另一個原因是,call_user_func本身有性能損失,因為相當于多了一級函數(shù)調(diào)用,回調(diào)注冊的方式可以直接$callback($args);callable本身會進行類型檢查;總之是好處多多。
即使是為了兼容性,也可以使用__set魔術(shù)方法把對這幾個回調(diào)的注冊轉(zhuǎn)換為on()的形式。
三 Worker類的可見性與初始化配置
Worker有大量的屬性,public和protected都有。但是,php并不能簡單設(shè)置readonly或者writeonly屬性,以至于有些應(yīng)該只讀的屬性,如$id,也是可寫的;有些應(yīng)該只寫的屬性,如onXxxxx,也是可讀的。當然,一個正確的基于workerman的程序不應(yīng)該非法讀寫這些屬性;只是,如果可以用較低的成本(事實上,對于程序性能毫無成本)提高這方面的可靠性,應(yīng)該是值得一做的。
四 與composer的協(xié)作
如果我的觀察沒錯的話,workerman是依賴于自帶的Autoloader.php的,同時也在composer.json里面定義了psr自動加載。
當然,因為作為一個常駐型的程序,autoload帶來的性能損失可以忽略不計;但是,對于使用composer管理包的開發(fā)者來說,似乎并無此必要。
以上意見,有的可能屬于雞蛋里挑骨頭,請酌情考慮。
一 沒有主進程啟動與結(jié)束回調(diào)
這個建議很好,當時開發(fā)也考慮過,但是最后還是決定不給用戶在主進程上編程的入口
原因是
1、主進程要保持穩(wěn)定性,加入業(yè)務(wù)代碼很有可能導(dǎo)致不穩(wěn)定
2、子進程會自動繼承主進程的這部分業(yè)務(wù)代碼,導(dǎo)致子進程行為也不可控(大多數(shù)phper不會理解或者考慮到這個問題)。比如在主進程Start時數(shù)據(jù)庫數(shù)據(jù)庫連接/redis/memcache在子進程是不可用的,主進程start的定時器在子進程也會運行,導(dǎo)致和預(yù)期不一致
全局的onStart 和 onStop可以有很多種方法,比如
1、在worker->id為0的進程的onWorkerStart/onWorkerStop中做
2、單獨啟動一個worker進程在onWorkerStart/onWorkerStop去做
3、寫個shell啟動腳本,在start或者stop執(zhí)行一段自己想要的業(yè)務(wù)邏輯
總之在主進程編碼很危險,無法保證每個phper都有多進程編程經(jīng)驗,所以workerman不打算提供這種機制,避免因為代碼質(zhì)量問題造成不穩(wěn)定和不必要的問題投訴。目前來看有主進程start/stop回調(diào)的需求用戶很少的。
二 注冊回調(diào)函數(shù)的方式并不好
恩像Gavin所說,見仁見智,各有優(yōu)勢吧,目前這種設(shè)置回調(diào)屬性的方法避免了一次函數(shù)調(diào)用,性能高一些。
另外就是能夠自動提示,少敲了很多代碼。這些是小問題,不爽可以直接繼承worker加個on('message',func)方法也沒問題。
另外$callback($args);這種如果$callback是類方法,會直接報錯(這個之前有測試過,當時php版本是5.3,不知道高php版本是否ok)。所以workerman使用了call_user_func方法
三 Worker類的可見性與初始化配置
這個建議不錯,但是感覺嚴格限制缺少了靈活性。
有些屬性確實是建議只讀的,比如說worker->id,但是覆蓋了也沒有問題,默認值可以看做是建議值吧。
onXXX不僅是可寫的,也應(yīng)該是可讀的,方便用戶判斷當前設(shè)置的是什么回調(diào)
四 與composer的協(xié)作
如果國內(nèi)每個用workerman的phper都會用composer,并且每個項目都用自覺使用composer,并且composer官網(wǎng)國內(nèi)訪問非常通暢,那么就可以把autoloader.php去掉,但是貌似上面任何一個條件都不能保證,所以還得給個默認的autoloader.php
非常感謝Gavin的建議