天天看點

PHP運作時性能基準測試

作者:不秃頭程式員
PHP運作時性能基準測試

測試環境

  • 每個運作時在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上找到。

結果

PHP運作時性能基準測試
PHP運作時性能基準測試
PHP運作時性能基準測試
PHP運作時性能基準測試
PHP運作時性能基準測試
PHP運作時性能基準測試
  • 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元件。