下面由laravel教程欄目給大家介紹shadowfax: 讓laravel佩上swoole之劍,希望對需要的朋友有所幫助!
Swoole可以說是php的一把利劍,它拓展了PHP的邊界,讓眾多PHPer們看到了高并發的曙光。利用Swoole來提高Laravel的性能,是一件非常值得投入的事情,這樣既能獲得Swoole的高性能,又兼顧了Laravel的高效率,兩全其美。Shadowfax就是一款這樣的拓展包,它簡單易用,能夠幫助開發者快速地將Laravel應用遷移到Swoole之上運行。
首先我們來看一下使用Shadowfax運行的Laravel應用的性能表現:
我使用wrk作為此次的benchmark工具,基于最新版的Laravel 7,但是移除了Session相關的middleware。因為Laravel默認是啟用了session的,而且session的驅動是file,如果在這種情況下去跑測試,每個請求都會創建一個session文件,這樣跑出來的結果就沒什么意義了。(追求性能的應用也不應該去使用file作為session驅動)
環境1:
- 硬件: 1 CPU, 4 Cores, 16GB Memory
- MacOS 10.15.3
- PHP 7.3.12(啟用opcache)
- Swoole 4.4.13
- Shadowfax 2(20個worker進程)
這個環境也就是我個人的Macbook Pro,性能比較好。我用wrk啟動4個線程,并發200進行壓測:
wrk -t4 -c200 http://127.0.0.1:1215/
結果為 12430 rps:
Running 10s test @ http://127.0.0.1:1215/ 4 threads and 200 connections Thread Stats Avg Stdev Max +/- Stdev Latency 26.44ms 31.44ms 212.73ms 84.28% Req/Sec 3.13k 839.99 6.07k 65.75% 124418 requests in 10.01s, 312.06MB read Socket errors: connect 0, read 54, write 0, timeout 0 Requests/sec: 12430.20 Transfer/sec: 31.18MB
環境2:
- 硬件: 2 CPUs, 2 Cores, 4GB Memory
- CentOS 7.5.1804
- PHP 7.3.16(啟用opcache)
- Swoole 4.4.17
- Shadowfax 2(10個worker進程)
這個環境是某云的一個虛擬云服務器實例,配置一般。我用wrk啟動2個線程,并發100進行壓測:
wrk -c100 http://127.0.0.1:1215/
結果為 4001 rps:
Running 10s test @ http://127.0.0.1:1215/ 2 threads and 100 connections Thread Stats Avg Stdev Max +/- Stdev Latency 25.06ms 12.11ms 85.92ms 60.94% Req/Sec 4.02k 41.46 4.08k 79.79% 40321 requests in 10.08s, 101.13MB read Requests/sec: 4001.76 Transfer/sec: 10.04MB
性能表現還不錯吧?比起傳統的PHP-FPM,已經有了巨大的提升。
安裝與使用
Shadowfax的安裝非常簡單,只需要兩個步驟即可搞定:
第一步,使用composer將Shadowfax安裝到你的Laravel項目中去:
composer require huang-yi/shadowfax
第二步,使用Laravel的Artisan命令shadowfax:publish來發布配置文件:
php artisan shadowfax:publish
執行完后,在你的項目根目錄就會創建一個名為shadowfax.yml的配置文件,你需要根據環境進行調整。當然這個文件會被自動添加到.gitignore中去,就像.env文件一樣,在不同的環境下配置可能是不一樣的。
現在就可以通過Shadowfax命令來啟動你的服務:
php shadowfax start
假如是默認配置的話,就可以通過http://127.0.0.1:1215訪問你的應用了。當然,這只是簡單的使用,更多的信息可前往Shadowfax項目主頁查看。
為什么選擇Shadowfax
當然,有些朋友會問,github上面已經有類似的開源項目了,為什么還要重復造一個輪子。其實不然,早在2016年我就開始嘗試整合Swoole和Laravel了,先后也開源了兩個相關的項目,目前這方面star數最高的 swooletw/laravel-swoole 就是fork了我早先發布的 huang-yi/laravel-swoole-http。但我并沒有對自己的項目進行推廣,因為我很清楚,之前的項目或多或少都存在一些問題,并且不能很好地支持協程,而協程恰好又是Swoole最強的武器,所以都放棄了。
現在,Shadowfax已經可以很好地支持協程了,你可以放心地開啟Swoole的協程特性。并且,Shadowfax還解決了協程環境下數據庫連接的問題,當你啟用Swoole的一鍵協程化后,Shadowfax會自動為你的數據庫連接創建連接池。最重要的是,這一切在你的應用代碼層面都是無感的,你還是像往常一樣去寫業務代碼,完全不要有心智負擔,因為Shadowfax不需要你對寫代碼的方式做出任何改變。
最后我想說明的是,Shadowfax并沒有去刻意賦予Laravel使用Swoole的能力,它的主要目的是:在不破壞Laravel開發體驗的前提下,以最小的成本提升Laravel應用的性能。我也不建議開發者在Laravel中使用Swoole的任何接口,因為Laravel本身是一個傳統PHP模式下運行的框架,對Swoole并不友好,如果你不是一個資深的Swoole開發者,很容易在使用過程中出錯。如果你的Laravel應用里未使用任何Swoole接口,這意味著你的程序在PHP-FPM模式下也是能運行的,一旦運行在Swoole上面的程序出了問題,我們便能立馬切回PHP-FPM模式,這樣可以保證程序的可用性。
相關推薦:最新的五個Laravel視頻教程