測試環境
- 每個運作時在1或2個Docker容器中運作
- 每個容器有1個CPU和1GB RAM
- 負載測試工具位于同一Docker網絡中
測試應用程式
Symfony提供了運作時元件。根據官方文檔,它“從任何全局狀态中提取引導邏輯,以確定應用程式可以在運作時運作,如”。這意味着,您可以使用任何您喜歡的運作時來開發應用程式,但在生産中運作最高性能。是以,我們不僅可以使用傳統的伺服器運作應用程式,還可以使用Swoole,AMPHP和ReactPHP等庫。展望未來,最後兩人被排除在競争之外。
負載測試工具
K6用于運作負載測試。每個運作時運作3次,30秒内有10、100和1000個并發連接配接。
運作時
- Apache(prefork模式)+ mod_php
- Apache(事件模式)+ PHP-FPM
- Nginx + PHP-FPM
- Nginx Unit應用伺服器
- Nginx Unit應用伺服器
- Nginx + Roadrunner(fcgi模式)
- FrankenPHP
- FrankenPHP(worker模式)
- Swoole
所有運作時都基于官方Docker鏡像。如果不使用鏡像,則在建構過程中将應用程式的代碼複制到鏡像中。PHP 8.3無處不在,除了Nginx Unit。2024年初,Nginx Unit支援的最高PHP版本為8.2。
不幸的是,我沒有找到與Symfony 7相容的最新版本的ReactPHP和AMPHP運作時。PHPPM GitHub和Dockerhub看起來都被抛棄了。
應用以下PHP和Symfony設定:
- 使用php.ini-production(附帶官方Docker容器)
- 已啟用Opcache
- 啟用JIT
- 根據Symfony最佳實踐配置preload
- Composer自動加載器已優化
- Symfony在生産模式下運作
- 服務容器轉儲到單個檔案
- Symfony緩存在容器建構期間預熱
應用程式代碼以及容器配置可以在GitHub https://github.com/DimDev/php-runtimes-benchmark上找到。
結果
- 001_Apache+mod_php和002_Apache + PHP-FPM顯示了幾乎相同的結果。
- 003_Nginx+PHP-FPM在工作負載較低(并發10和100)時非常接近001_Apache+mod_php和002_Apache + PHP-FPM。
- 003_Nginx+PHP-FPM在并發量為1000時,能夠服務的請求數是Apache堆棧的2倍
- 004_Nginx單元。首先-哇!!它比傳統和最流行的003_Nginx+PHP-FPM快3倍
- 我不認為005_Roadrunner和006_Nginx+Roadrunner之間有很大的差別
- 盡管如此,基于Roadrunner的堆棧比003_Nginx+PHP-FPM快2倍以上
- 007_FrankenPHP(非工作模式)從性能角度來看非常接近003_Nginx+PHP-FPM
- 008_FrankenPHP(worker mode). Double WOW!我不相信從第一次嘗試和運作負載測試3或4倍。是以,當發送1000個并發請求時,FrankenPHP(勞工模式)比Nginx+PHP-FPM快10倍。同時,也面臨着一個問題。無法用php-ini. production啟動容器。
- 009_swoole -也是雙重WOW!.幾乎與008_FrankenPHP(wm)相同的速度。非常快。但是,請記住,您的代碼應該調整為與Swoole一起運作。對于Symfony,我們有一個bundle,它擴充了symfony/runtime元件。