首頁  >  文章  >  php框架  >  利用Swoole來提升Laravel的效能(Shadowfax)

利用Swoole來提升Laravel的效能(Shadowfax)

藏色散人
藏色散人轉載
2021-05-25 14:45:442726瀏覽

下面由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模式,這樣可以保證程序的可用性。

以上是利用Swoole來提升Laravel的效能(Shadowfax)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除