ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## **简介** 基于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`目录下: ![](https://img.kancloud.cn/3f/d5/3fd5482f3b717353bdd5b9eecaa4cf09_2238x144.jpg) 你可以在配置文件中对 Swoole 进行一些基本配置,而脚本文件主要用于管理 Swoole 服务的启动、重载、关闭等操作。 ## **启动LaravelS** 完成上述操作后,就可以通过`php bin/laravels start`命令启动 LaravelS 了: ![](https://img.kancloud.cn/76/64/7664d0ced793cc6db101b0038f2c4853_1390x620.jpg) 这样,Swoole 服务就被启动起来,监听本地的 5200 端口,如果有请求发送到这个端口,它就可以进行处理。 此外`php bin/laravels`还支持其它命令对 LaravelS 进行管理: ![](https://img.kancloud.cn/20/04/2004c78125c4f10662786ad8bfdeacae_1814x700.jpg) ## **基于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,运行结果如下: ![](https://img.kancloud.cn/0e/95/0e955ec4ef59b98647ca9767094d0209_1246x1470.jpg) 返回的数据很多,核心关注的是每秒请求数(Requests per second),基于 PHP-FPM 驱动的博客应用首页每秒仅支持 2.28 个请求,下面再看看基于 Swoole 驱动的`blog-s.test`,测试条件完全一样: ![](https://img.kancloud.cn/2a/82/2a8290886b2d8766eb93b9814d8a1509_1282x1470.jpg) 可以看到其每秒支持的请求数是 20.24,即每秒可处理20个请求,是前者的 10 倍!当然,这仅仅是在本地开发环境进行的简单测试,线上生产环境数据可能会有出入,但总体来说,基于 Swoole 的后端 HTTP 服务器性能更好是毋庸置疑的。