## **簡介**
基于Swoole特性提升應用性能是提高應用整體性能的一種方式(但不是唯一方式),這些優良特性已經被第三方擴展包[LaravelS](https://github.com/hhxsv5/laravel-s)整合到了 Laravel 框架,我們可以通過這個擴展包輕松在 Laravel 應用中實現上述特性。
需要說明的是,LaravelS 并不是在 Laravel 框架中使用 Swoole 的唯一方式,只是我們基于這個擴展包可以快速入門,免去很多不必要的配置和整合操作,你可以將其看作套在 Swoole 之上的一層殼,或者一個代理,真正提供服務的還是底層的 Swoole。
## **安裝配置LaravelS**
在 Laravel 應用中使用 Swoole 之前,先通過 Composer 安裝 LaravelS 擴展包:
~~~
composer require hhxsv5/laravel-s
~~~
該擴展包具備自動發現功能(Laravel 5.5 以上版本可用),無需手動在`config/app.php`配置文件中注冊,安裝完成后,運行如下 Artisan 命令相應腳本和配置文件發布到根目錄下:
~~~
php artisan laravels publish
~~~
該命令會發布配置文件`laravels.php`到`config`目錄下,以及腳本文件到`bin`目錄下:

你可以在配置文件中對 Swoole 進行一些基本配置,而腳本文件主要用于管理 Swoole 服務的啟動、重載、關閉等操作。
## **啟動LaravelS**
完成上述操作后,就可以通過`php bin/laravels start`命令啟動 LaravelS 了:

這樣,Swoole 服務就被啟動起來,監聽本地的 5200 端口,如果有請求發送到這個端口,它就可以進行處理。
此外`php bin/laravels`還支持其它命令對 LaravelS 進行管理:

## **基于LaravelS構建HTTP服務器**
這里我們以Valet + Nginx 為例,進行示例演示,使用 Apache 作為 Web 服務器的話可以參考[官方文檔](https://github.com/hhxsv5/laravel-s#cooperate-with-apache)。
### **配置Nginx**
我們知道在使用 Nginx 作為 Web 服務器的時候,前端資源文件,比如 CSS、JS、圖片等靜態資源都是通過 Nginx 進行處理的,比較高效,而 PHP 腳本請求這種動態資源都是轉發到后端 PHP-FPM 進程進行處理,如果要基于 Swoole 實現高性能 HTTP 服務器,則這個 HTTP 服務器替代的也是 PHP-FPM 的職能,也就是說,我們將原本轉發到 PHP-FPM 進程的請求轉發給 Swoole 進行處理。在本例中,就是轉發給 LaravelS 服務。
為此,我們在Nginx【配置目錄~/.config/valet/Nginx/】中新增一個站點配置`blog-s.conf`,編寫示例配置如下:
```
upstream laravels {
# Connect IP:Port
server 127.0.0.1:5200 weight=5 max_fails=3 fail_timeout=30s;
keepalive 16;
}
server {
listen 80;
server_name blog-s.test;
root /var/www/blog/public;
index index.php index.html index.htm;
# Nginx 處理靜態資源,LaravelS 處理動態資源
location / {
try_files $uri @laravels;
}
location @laravels {
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-PORT $remote_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header Scheme $scheme;
proxy_set_header Server-Protocol $server_protocol;
proxy_set_header Server-Name $server_name;
proxy_set_header Server-Addr $server_addr;
proxy_set_header Server-Port $server_port;
proxy_pass http://laravels;
}
}
```
然后我們配置一個虛擬域名`blog-s.test`。
### **配置Laravel應用**
接下來,在`blog`項目根目錄下打開`.env`,新增下面兩條配置:
~~~
LARAVELS_LISTEN_IP=127.0.0.1
LARAVELS_DAEMONIZE=true
~~~
`LARAVELS_LISTEN_IP`用于設置 LaravelS 監聽的 IP 地址,這里的地址和 Nginx 配置轉發的 IP 地址保持一致,`LARAVELS_DAEMONIZE`用于設置后臺啟動 LaravelS 服務。
最后重啟 Valet 相關服務,并到`blog`項目目錄下運行`php bin/laravels start`啟動 LaravelS 后端服務。
在瀏覽器中訪問`http://blog-s.test/`,可以正常訪問blog首頁了。
## **性能對比測試**
下面我們通過壓力測試工具`ab`分別對基于 PHP-FPM 和 LaravelS(Swoole) 驅動的應用進行性能對比測試,兩者共享同一份項目代碼,都是基于 Valet 環境,除了處理后端請求的服務不同之外,運行環境完全一致。
首先來看基于 PHP-FPM 的`blog.test`,我們假設總請求數是 100,并發數是 10,運行結果如下:

返回的數據很多,核心關注的是每秒請求數(Requests per second),基于 PHP-FPM 驅動的博客應用首頁每秒僅支持 2.28 個請求,下面再看看基于 Swoole 驅動的`blog-s.test`,測試條件完全一樣:

可以看到其每秒支持的請求數是 20.24,即每秒可處理20個請求,是前者的 10 倍!當然,這僅僅是在本地開發環境進行的簡單測試,線上生產環境數據可能會有出入,但總體來說,基于 Swoole 的后端 HTTP 服務器性能更好是毋庸置疑的。