其實(shí)已經(jīng)寫(xiě)了很久,但沒(méi)在生產(chǎn)環(huán)境用過(guò)。也沒(méi)宣傳過(guò)。
https://github.com/dvaknheo/workermanhttpd
https://gitee.com/dvaknheo/workermanhttpd
寫(xiě)的時(shí)候參照 webman 精簡(jiǎn)的。
開(kāi)始還想和協(xié)程方式那樣處理折騰一些問(wèn)題,后來(lái)沒(méi)管了
再后來(lái)配合我的 duckphp 框架 實(shí)現(xiàn) fpm/ workerman 兩棲。
對(duì) workerman 了解不深,不知道會(huì)有什么問(wèn)題。
workerman 也是和 php-fpm 一樣多子進(jìn)程的吧。
如果是用協(xié)程模式,wokermanhttpd 的協(xié)程安全會(huì)有問(wèn)題。
其他地方就沒(méi)底了
暫時(shí)沒(méi)有細(xì)致看代碼,但要說(shuō)問(wèn)題,可能就是這個(gè)東西有沒(méi)有實(shí)際意義了;
一般情況從fpm切換到cli下面無(wú)非是想使用常駐或者一些多線(xiàn)程的一些便利,在一些工程處理上肯定是做搬遷;舉個(gè)例子,比如之前開(kāi)發(fā)的是TP框架,我現(xiàn)在想切換到cli下面使用不管是Workerman還是reactPHP還是swoole,肯定優(yōu)先考慮的是業(yè)務(wù)代碼變動(dòng)不要太大的切入到這套體系里;cli->fpm反之亦然。
沒(méi)有哪個(gè)用戶(hù)會(huì)因?yàn)閮蓷x擇一個(gè)框架,是沒(méi)有市場(chǎng)的,如果是一個(gè)易移植的框架可能會(huì)非常吃香。
那么,看來(lái)就和 webman 類(lèi)似的了。WorkermanHttpd 并不是個(gè)框架,而是 http 服務(wù)器。
兼容直接調(diào)用 public 目錄下直接使用 .php 文件的功能。
直接 echo 輸出,不用非得在 Response 對(duì)象里操作。
header() 之類(lèi)的不兼容函數(shù),只需要在前面加個(gè)
改由 WorkermanHttpd::header() 就可以了,參數(shù)也一樣。
其實(shí)要在webman上面實(shí)現(xiàn)和fpm其實(shí)也不是很難,寫(xiě)兩個(gè)入口,甚至利用start.php作為fpm的入口也可以,只需稍稍改造以下即可;
判斷是否是cli模式,如果不是,就走fpm那一套,利用composer autoload加載框架對(duì)應(yīng)的內(nèi)容執(zhí)行并返回,如果是cli并且有workerman常量,那么就走webman相關(guān)的邏輯,關(guān)于http服務(wù)器,其實(shí)對(duì)于webman來(lái)說(shuō)只是其中的一個(gè)進(jìn)程而已。
當(dāng)然,如果不想這么暴力,想要用工程化的思路解決這個(gè)地方的這個(gè)問(wèn)題的話(huà),可以使用適配器模式處理,就好比數(shù)據(jù)庫(kù)的各種驅(qū)動(dòng),mysql驅(qū)動(dòng)、odbc驅(qū)動(dòng)、pgsql驅(qū)動(dòng)等