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