在 Swoole 之上加速 Laravel
发布于 作者 Albert Chen
Swoole 是一个面向生产环境的 PHP 异步编程框架。它是一个用纯 C 语言编写的 PHP 扩展,它使 PHP 开发人员能够在 PHP 中编写高性能、可扩展、并发 TCP、UDP、Unix socket、HTTP、WebSocket 服务,而无需太多关于非阻塞 I/O 编程和底层 Linux 内核的知识。你可以将 Swoole 视为类似于 NodeJS 但针对 PHP 的框架,具有更高的性能。
为什么在 Swoole 上运行 Laravel?
下图说明了 PHP 的生命周期。如你所见,每次运行 PHP 脚本时,PHP 都需要初始化模块并启动 Zend 引擎以创建运行环境。你的 PHP 脚本需要被编译成 OpCodes 以供 Zend 引擎执行。
然而,这种生命周期需要在每次请求中重复进行。因为为单个请求创建的环境将在请求处理完成后立即销毁。
换句话说,在传统的 PHP 生命周期中,它浪费了大量时间构建和销毁脚本执行所需的资源。想象一下,在像 Laravel 这样的框架中,它需要加载多少文件才能处理一个请求?加载文件也需要大量的 I/O 操作。
那么,如果我们有一个建立在 Swoole 之上的内置服务器,并且所有脚本都可以在第一次加载后保存在内存中呢?这就是我们尝试在 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 locationsudo echo "extension=swoole.so" >> php.ini # add the extension=swoole.so to the end of php.iniphp -m | grep swoole # check if the swoole extension has been enabled
访问 官方网站 获取更多信息。
注意:Swoole 目前仅支持 Linux 和 OSX。Windows 服务器目前还无法使用 Swoole。
然后,添加服务提供者
如果你使用的是 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>
现在你可以在 http://127.0.0.1:1215
上访问你的 Laravel 应用程序。
基准测试
使用 MacBook Air 13,2015 年款,测试干净的 Lumen 5.5。基准测试工具:wrk
wrk -t4 -c100 http://your.app
Nginx 与 FPM
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 readRequests/sec: 80.93Transfer/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 readRequests/sec: 8717.00Transfer/sec: 1.55MB
了解更多
查看 Github 代码库 和 官方文档 获取更多信息。
您好,我是 Albert Chen,一名软件架构师、Laravel 工匠和 Swoole 爱好者,现居台湾