Shadowfax: 讓Laravel佩上Swoole之劍

Swoole能夠說是PHP的一把利劍,它拓展了PHP的邊界,讓衆多PHPer們看到了高併發的曙光。利用Swoole來提升Laravel的性能,是一件很是值得投入的事情,這樣既能得到Swoole的高性能,又兼顧了Laravel的高效率,一箭雙鵰。Shadowfax就是一款這樣的拓展包,它簡單易用,可以幫助開發者快速地將Laravel應用遷移到Swoole之上運行。php

首先咱們來看一下使用Shadowfax運行的Laravel應用的性能表現:laravel

我使用wrk做爲這次的benchmark工具,基於最新版的Laravel 7,可是移除了session相關的middleware。由於Laravel默認是啓用了session的,並且session的驅動是file,若是在這種狀況下去跑測試,每一個請求都會建立一個session文件,這樣跑出來的結果就沒什麼意義了。(追求性能的應用也不該該去使用file做爲session驅動)git

環境1:github

  • 硬件: 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進行壓測:shell

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進行壓測:swoole

wrk -c100 http://127.0.0.1:1215/

結果爲 4001 rpssession

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上面已經有相似的開源項目了,爲何還要重複造一個輪子。其實否則,早在2015年我就開始嘗試整合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模式,這樣能夠保證程序的可用性。

若是你對 Shadowfax 感興趣,歡迎前往Github點上一個star以表支持。

我是黃毅,歡迎關注個人 Github博客

相關文章
相關標籤/搜索