Swoole 是為 PHP 開(kāi)發(fā)的生產(chǎn)級(jí)異步編程框架嬉橙。 他是一個(gè)純 C 開(kāi)發(fā)的擴(kuò)展华弓, 他允許 PHP 開(kāi)發(fā)者在 PHP 中寫 高性能润樱,可擴(kuò)展的并發(fā) TCP舷嗡, UDP衣赶, Unix socket调缨, HTTP慨菱, WebSocket 服務(wù)燃箭, 而不需要擁有太多的非阻塞 I/O 編程和低級(jí)別的 Linux 內(nèi)核知識(shí)。 你可以把 Swoole 想象成 NodeJS鸥咖, 但對(duì)于 PHP 來(lái)說(shuō)將有更高性能燕鸽。
為什么要在 Swoole 上運(yùn)行 Laravel?
下圖展示了 PHP 的生命周期。正如你所看到的那樣啼辣,當(dāng)你每次運(yùn)行 PHP 腳本的時(shí)候啊研,PHP都需要初始化模塊并為你的運(yùn)行環(huán)境啟動(dòng)Zend引擎。并且將 PHP 腳本編譯為 OpCodes 以便 Zend引擎執(zhí)行鸥拧。
但是党远, 這樣的生命周期需要在每次請(qǐng)求的時(shí)候都執(zhí)行一遍。因?yàn)閱蝹€(gè)請(qǐng)求創(chuàng)建的環(huán)境在請(qǐng)求執(zhí)行結(jié)束后會(huì)立即銷毀富弦。
換句話說(shuō)沟娱, 在傳統(tǒng)的 PHP 生命周期中, 為了腳本執(zhí)行而浪費(fèi)了大量的時(shí)間去創(chuàng)建和銷毀資源腕柜。想象一下像 Laravel 這樣的框架济似, 在每次請(qǐng)求中需要加載多少文件? 同時(shí)也浪費(fèi)了大量的 I/O 操作
因此如果我們利用 Swoole 內(nèi)置一個(gè)應(yīng)用級(jí)別的 Server, 并且所有腳本文件在加載一次之后便可以保存在內(nèi)存中呢盏缤? 這就是為什么我們需要嘗試在 Swoole 上運(yùn)行 Laravel碱屁。 Swoole 可以提供強(qiáng)大性能而 Laravel 則可以提供優(yōu)雅代碼結(jié)構(gòu)使用。這倆兒真是完美組合 !
安裝
以下是 swooletw/laravel-swoole
的主要特點(diǎn):
- 在 Swoole 運(yùn)行 Laravel/Lumen 應(yīng)用
- 出色的性能提升至 30x
- 沙盒模式隔離應(yīng)用程序容器
- 支持在 Laravel 應(yīng)用中運(yùn)行 WebSocket 服務(wù)器
- 支持
Socket.io
協(xié)議 - 支持 Swoole 表跨進(jìn)程共享
使用 Composer 安裝:
$ composer require swooletw/laravel-swoole
這個(gè)包依賴于 Swoole 蛾找。在使用這個(gè)包之前娩脾,請(qǐng)確保你的機(jī)器安裝了正確的 Swoole 。使用下面的命令快速安裝(linux):
pecl install swoole
在安裝這個(gè)擴(kuò)展之后打毛,你需要編輯 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
訪問(wèn) 官網(wǎng) 獲取更多的信息。
注意:Swoole 現(xiàn)在只支持 Linux 和 OSX 幻枉。Windows 服務(wù)器現(xiàn)在還不支持碰声。
然后,添加服務(wù)提供者:
如果你使用 Laravel 熬甫,在 config/app.php
服務(wù)提供者數(shù)組添加該服務(wù)提供者:
[
'providers' => [
SwooleTW\Http\LaravelServiceProvider::class,
],
]
如果你使用 Lumen 胰挑,請(qǐng)將下面的代碼添加到 bootstrap/app.php
:
$app->register(SwooleTW\Http\LumenServiceProvider::class);
這個(gè)包支持包自動(dòng)發(fā)現(xiàn)機(jī)制。如果你運(yùn)行 Laravel 5.5 以上版本椿肩,你可以跳過(guò)這一步瞻颂。
建立并運(yùn)行起來(lái)
現(xiàn)在,你可以執(zhí)行以下的命令來(lái)啟動(dòng) Swoole HTTP 服務(wù)郑象。
$ php artisan swoole:http start
然后你可以看到以下信息:
Starting swoole http server...
Swoole http server started: <http://127.0.0.1:1215>
現(xiàn)在可以通過(guò)訪問(wèn) http://127.0.0.1:1215
來(lái)進(jìn)入 Laravel 應(yīng)用贡这。
基準(zhǔn)測(cè)試
使用 MacBook Air 13寸(2015年產(chǎn))及干凈的 Lumen 5.5 項(xiàng)目測(cè)試:
基準(zhǔn)測(cè)試工具: 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 服務(wù)
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
更多信息
在 Github Repo 查看官方包, 也可以參考 官方文檔 獲取更多信息厂榛。
更多現(xiàn)代化 PHP 知識(shí)盖矫,請(qǐng)前往 Laravel / PHP 知識(shí)社區(qū)