在Swoole上加速Laravel應用
Swoole是用於PHP的生產級非同步編程框架。它是用純C語言編寫的PHP擴展,它使PHP開發人員可以在PHP中編寫高性能,可伸縮的並發TCP,UDP,Unix套接字,HTTP,WebSocket服務,而無需過多了解非阻塞I / O編程和低級Linux內核。你可以將 Swoole視為 NodeJS之類,但適用於PHP,具有更高的性能。
為什麼要在 Swoole 上運行 Laravel?
下圖展示了 PHP 的生命周期。正如你所看到的那樣,當你每次運行 PHP 腳本的時候,PHP 都需要初始化模組並為你的運行環境啟動 Zend 引擎。並且將 PHP 腳本編譯為 OpCodes 以便 Zend 引擎執行。
但是, 這樣的生命周期需要在每次請求的時候都執行一遍。因為單個請求創建的環境在請求執行結束後會立即銷毀。
換句話說, 在傳統的 PHP 生命周期中,它浪費了大量時間來構建和破壞用於腳本執行的資源。想像一下像 Laravel 這樣的框架, 在每次請求中需要載入多少文件?載入文件也有很多I / O消耗。
因此如果我們利用 Swoole 內置一個應用級別的 Server, 並且所有腳本文件在載入一次之後便可以保存在記憶體中呢? 這就是為什麼我們需要嘗試在 Swoole 上運行 Laravel。Swoole可以成為強大的性能提升器,而Laravel提供了優雅的結構和程式碼用法。那是一個完美的組合!
安裝
以下是 swooletw/laravel-swoole 的主要特點:
- 在 Swoole 運行 Laravel/Lumen 應用
- 出色的性能提升至 30x
- 沙盒模式隔離應用程式容器
- 支援在 Laravel 應用中運行 WebSocket 伺服器
- 支援 Socket.io 協議
- 支援 Swoole 表跨進程數據共享
使用Composer需要此軟體包:
$ composer require swooletw/laravel-swoole
該軟體包依賴Swoole擴展。使用此軟體包之前,請確保已安裝Swoole。使用此命令快速安裝它:
pecl install swoole
在安裝這個擴展之後,你需要編輯 php.ini 添加 extension=swoole.so 一行。
php -i | grep php.ini # check the php.ini file location sudo echo "extension=swoole.so" >> php.ini # add the extension=swoole.so to the end of php.ini php -m | grep swoole # check if the swoole extension has been enabled
注意:Swoole 現在只支援 Linux 和 OSX 。Windows 伺服器現在還不支援。
然後,添加服務提供者:
如果你使用 Laravel ,在 config/app.php 服務提供者數組添加該服務提供者:
[ 'providers' => [ SwooleTW\Http\LaravelServiceProvider::class, ], ]
如果你使用 Lumen ,請將下面的程式碼添加到 bootstrap/app.php:
$app->register(SwooleTW\Http\LumenServiceProvider::class);
這個包支援包自動發現機制。如果你運行 Laravel 5.5 以上版本,你可以跳過這一步。
建立並運行起來
現在,你可以執行以下的命令來啟動 Swoole HTTP 服務。
$ php artisan swoole:http start
然後你可以看到以下資訊:
Starting swoole http server... Swoole http server started: <http://127.0.0.1:1215>
現在可以通過訪問 //127.0.0.1:1215 來進入 Laravel 應用。
基準測試
使用 MacBook Air 13 寸(2015 年產)及乾淨的 Lumen 5.5 項目測試:
基準測試工具: wrk
wrk -t4 -c100 http://your.app
基於 FPM 的 Nginx
Running 10s test @ http://lumen.app:9999 4 threads and 100 connections Thread Stats Avg Stdev Max +/- Stdev Latency 1.14s 191.03ms 1.40s 90.31% Req/Sec 22.65 10.65 50.00 65.31% 815 requests in 10.07s, 223.65KB read Requests/sec: 80.93 Transfer/sec: 22.21KB
Swoole HTTP 服務
Running 10s test @ http://127.0.0.1:1215 4 threads and 100 connections Thread Stats Avg Stdev Max +/- Stdev Latency 11.58ms 4.74ms 68.73ms 81.63% Req/Sec 2.19k 357.43 2.90k 69.50% 87879 requests in 10.08s, 15.67MB read Requests/sec: 8717.00 Transfer/sec: 1.55MB