網上充斥着各式各樣的 PHP 框架性能對比的文章。然而,他們總是把“蘋果”和“橘子”做對比(看上去有點兒像,都是圓的,但其實不是一碼事)。這次,我將着重對 Laravel、Symfony 和 Zend 這三個框架做性能對比,並且還要說明為什么這三個框架總是被錯誤的進行比較。
我給的對比結果你不必全信。讀完這篇文章之后,你可以自己搞一個 2GB 的 DigitalOcean 的服務器親自去檢驗一下,也就 5 分鍾而已。
開始之前,我希望你知道:所有這些框架都足夠快,都可以滿足你構建任何應用。寫這篇文章之前我也猶豫過,我認為做這種層次的對比其實真的挺傻的。我唯一的目的是展示如何在三個框架之間進行公平的比較。
問題的源頭
當你在一台全新的 DigitalOcean 服務器上配置 Symfony 或 Zend 項目時,你會發現返回的 http 響應是沒有 session 信息的。注意,看下圖,cookie 並沒有被返回:
然而,Laravel 默認是開啟 session 的(另外還有一些中間件)。這樣能讓基於 Laravel 構建的應用很方便地利用 session 機制將用戶狀態持久化保存。為了 Laravel 框架的用戶更方便而默認開啟 session 反倒讓 Laravel 在性能對比中很受傷。
另一個常見錯誤是:要么沒有倒出一份優化過的 Composer autoloader ;要么沒有用 php artisan config:cache
指令緩存 Laravel 配置信息 -- 這份緩存能夠大幅度減少 Laravel 的啟動(bootstrap)時間。
設置環境
首先,我通過 Laravel Forge 在 DiginalOcean 上創建了一個 2GB 內存的服務器,安裝的是 PHP 7.1 版本。然后安裝 Symfony ,優化 Composer autoloader ,配置 Nginx 通過生產環境下的前端控制器(app.php)運行。並且我還按照 Symfony 生產環境調優指南一步步設置到位。對於 Zend 的配置也類似。
接下來,針對 PHP 7.1 的 opcache 設置如下(生產環境):
opcache.enable=1
opcache.memoryconsumption=512
opcache.internedstringsbuffer=64
opcache.maxacceleratedfiles=20000
opcache.validatetimestamps=0
opcache.savecomments=1
opcache.fastshutdown=1
安裝 Laravel 時,執行 config:cache
Artisan 指令,並且在 app/Http/Kernel.php
文件中將 web
中間件組注釋掉(這些中間件的作用就是讓 Laravel 支持 session)。做完上述修改之后就可以讓三個框架都在無 session 支持的狀態下進行對比了。
對比結果
After configuring the projects, I ran a simple test using Apache benchmark, which anyone can recreate:
三個框架都能正常運行后,終於可以祭出 Apache benchmark 來做簡單的測試了。其實任何人都可以很容易地復現這一測試:
ab -t 10 -c 10 [http://server.address/]
下面是測試結果:
無 Session:
- Laravel: 609.03 次請求/秒 (平均值)
- Zend: 559.91 次請求/秒 (平均值)
- Symfony: 532.97 次請求/秒 (平均值)
有 Session:
- Laravel: 521.64 次請求/秒(平均值)
- Zend: 484.94 次請求/秒 (平均值)
- Symfony: 439.37 次請求/秒 (平均值)
原文地址:https://medium.com/@taylorotwell/benchmarking-laravel-symfony-zend-2c01c2b270f8#.kf4gywdmg