拯救php性能的神器webman-初入門

無意間發現的這個神器webman,真是秋名山上的騰源拓海!

該框架是workerman下的一個web開發的生態,我們可以先看看這裏workerman的官方網站

workerman早有耳聞,知道它蠻厲害的,跟swoole也不相上下,這次主要是說webman,可以看這裏 

話不多說,趕緊上手。

1. 安裝

這個安裝真的很簡單,就一句話  composer create-project workerman/webman 就是它要求你的PHP版本和composer版本

很好,我們直接就跑起來

2. 修改服務端口配置

然後就進去  cd webman ,vscode打開這個文件夾, code . 

找到  config/server.php  改一下默認的IP:端口。這裏我就把原來的  0.0.0.0  改爲了 127.0.0.1  端口繼續用  8787 

 然後就在命令行上面執行  php start.php start 把服務運行起來

好了,服務已經起來了。現在實際上就是 php在監聽  127.0.0.1  的  8787  端口

3. 分析入口代碼

我們看一下代碼

顯然這裏的controller是app下面的這個默認的  IndexController.php  文件控制器,好,我們打開這個文件可以看到默認方法

就是說首頁實際上是讀取了 README.md 文件來的,這樣,我們去訪問一下首頁的 http://127.0.0.1:8787/ 看一下結果,我們得到了這個

 好的,然後我們嘗試着直接改一下這個文件看看。

我們改爲這個樣子看看

 然後再刷新首頁

我們可以看到,這裏結果直接就變化了,這說明我們的代碼是立即生效的。這個和swoole還是稍微有點不同的,那個要重新啓動一下服務(不過我記得應該也有插件還是什麼來着能夠讓代碼立即更新的,但是要另外設置一下)

這裏我們可以將這個更新稱爲熱更新,就是服務還在運行,但是服務提供的代碼變了。

4. 分析靜態變量作緩存

這裏我注意到有個 static 關鍵字,感覺這個東西不得了啊,我就大膽的按照我預想的去嘗試了一下。

我將if判斷裏面加一個小小的調試。

好了代碼改好了,我們Ctrl+C把服務停掉,再執行一下把服務開起來  。

就像上圖我的操作一樣,我第一次點擊刷新進行訪問,命令行輸出了這句話 Will you only see me once time?

但是我後面的刷新訪問,再也沒有這樣的話輸出了,這說明了什麼?

這說明這個變量是在命令行裏面的靜態變量,就意味着,他只會在if裏面賦值一次,那也就是說,如果某些數據是從庫裏面拿到的而且不經常變化,我們完全可以拿這個靜態變量進行存儲,當作內存緩存在用,它比 file_get_contents 這樣的文件緩存還快。

因爲在以往php以 fastcgi或者FPM模式運行的場景下,請求與請求之間是獨立的,總是有服務器進行轉發或者解析的,那麼這個時候兩個請求之間是不能共用變量的,除非是那種 $_SERVER $_SESSION 等變量,但是這種東西顯然不合適用來存儲緩存數據的。所以我們一般會用 file 文件緩存serialize或者json_encode好數據,然後讀取的時候讀文件再反序列化來給後面的請求用,又或者我們覺得文件讀寫太慢更高級的 memcache redis緩存,但是即便是用這種內存服務器緩存,它也有開銷需要連接內存服務器,更激進一些我們用本地的Apc Yac緩存,可是這種東西我之前測試發現它有一個容量上面的限制,不是很方便給這種很大變量的緩存用。而這個時候我們能看到這個webman直接將靜態變量就能複用給不同的請求,實在是太快太方便了,等於後面的請求在index方法裏面就走了兩行代碼就直接return了,真的牛!

先別高興太早,仔細思考了一下,我覺得這樣也是有點風險的,如果開發人員塞進來一個大數組或大的變量,或者說開始寫代碼的時候數據量少,從數據庫讀出來就這樣賦值了,後來隨着數據量的猛增,這個內容越來越大,這樣命令行這裏佔用的內存也將越來越大,我猜測這裏的變量是不釋放的,直接是給下一個請求在用,我不知道這個框架它有沒有那種自動回收變量內存的機制,如果沒有,那這裏還真可能是個安全隱患。

所以,這對於我們開發而言,就必須要更謹慎小心的使用這個功能,雖然它真的很快很好用。

好了關於這裏的靜態變量緩存我們先探討到這裏,然後我們看看另外兩個方法。

5. 首頁另外兩個方法

這裏看看另外兩個方法,一個是 view , 一個是 json

view的就很簡單,代碼如下

就是渲染了模板,然後賦值name變量,簡單猜測一下 肯定是在什麼 view 文件夾裏面的 index 文件夾 裏面的 view.html 之類的

然後去看了看果然

 好了,這裏很簡單,就是把 name 變量輸出來,看看訪問效果

咦?怎麼會這樣,這裏不通?又想了想,哦,原來是 1234678,年輕人不講5的(武德) 啊!

重新按照這個訪問  http://127.0.0.1:8787/index/view 

 好了,有了。

然後再看看另外一個 json 的,代碼如下:

 吸取教訓,這樣訪問  http://127.0.0.1:8787/index/json 

 得到了序列化json,可能你會奇怪爲什麼你的瀏覽器訪問的效果不是這樣的,你可能得到的是這樣的

哈哈,那是因爲我給我的chrome瀏覽器安裝了一個插件,叫  JSON-handle

你可以在 chrome 的插件市場裏面搜索JSON找到它

當然了,很有可能你都打不開這個網站。(你看看這站點域名就知道了)

6. 請求壓力測試

好了,現在該給它上點強度了。我下載了一個軟件叫 ddosify 。你可以這樣安裝它  sudo apt install ddosify 

然後在命令行裏面 對剛剛的這個站點來測試一下。

先執行這個,給它來個 5000 個請求

ddosify -t http://127.0.0.1:8787/index/json -d 1 -n 5000

用 ddosify 給這個URL   http://127.0.0.1:8787/index/json 進行請求(-t參數設置),持續1秒(-d參數設置),發起請求 5000次(-n參數設置)

看樣子感覺良好嘛,平均時間是 0.00187s 也就是 1.87 毫秒,不過畢竟這代碼啥也沒幹就返回了json。

再加大強度!上2萬個請求!

好傢伙,真是人才啊!這都頂住了,成功率百分百,而且花費時間反而短了,只用了 0.36 毫秒,都不知道說啥好了。 

再加大力度! 上5萬個請求!

總算出現失敗了吧。看樣子還是慢厲害的,都頂住了這麼多請求,這在原來nginx或者apache的那種場景下,不知道會怎麼樣。

沒有數據是沒法說話的,我們試試看。現將代碼修改成一樣。

先看看apache2 啓動!  sudo systemctl start apache2 再次測試 

果然5000就頂不住了

 後續我又測試了一下,2000也沒頂住啊,不過也有可能是我的apache2沒有調優導致的。

好,再看看 nginx。

好樣的 nginx! 頂住了第一波 5000 個請求

再上點強度!2萬個請求試試看。

 再加大強度!5萬個請求試試看。

看來大家都是在5萬個請求這裏頂不住了。好的,你們已經盡力了,辛苦同志們了!

從單純的返回json數據的請求測試結果來看,這個框架還是厲害的,也能和nginx有一定程度上的媲美,我也感覺到了webman真是秋名山上的AE86啊!

感覺有了這個框架,就像給拓海的AE86換上了4A-GEU發動機,讓他不再受制於馬力的大小限制,真正狂飆起來!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章