在 Swoole 之上加速 Laravel

发布于 作者

Speed Up Laravel on Top of Swoole image

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 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 服务器目前还无法使用 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 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

了解更多

查看 Github 代码库官方文档 获取更多信息。

Albert Chen photo

您好,我是 Albert Chen,一名软件架构师、Laravel 工匠和 Swoole 爱好者,现居台湾

我的网站:https://albert-chen.com

分类于
Cube

Laravel 新闻通讯

加入 40,000 多名其他开发者,永不错过新的技巧、教程等。

Laravel Forge logo

Laravel Forge

轻松创建和管理您的服务器,并在几秒钟内部署您的 Laravel 应用程序。

Laravel Forge
Tinkerwell logo

Tinkerwell

Laravel 开发者的必备代码运行器。使用 AI、自动完成和本地和生产环境的即时反馈进行测试。

Tinkerwell
No Compromises logo

绝不妥协

Joel 和 Aaron 是来自 "绝不妥协" 播客的两位经验丰富的开发者,现已可以为您的 Laravel 项目提供服务。 ⬧ 固定价格 7500 美元/月。 ⬧ 无需冗长的销售流程。 ⬧ 无需合同。 ⬧ 100% 退款保证。

绝不妥协
Kirschbaum logo

Kirschbaum

提供创新和稳定性,确保您的 Web 应用程序取得成功。

Kirschbaum
Shift logo

Shift

正在运行旧版本的 Laravel?即时、自动的 Laravel 升级和代码现代化,使您的应用程序保持新鲜。

Shift
Bacancy logo

Bacancy

仅需每月 2500 美元,即可为您的项目配备经验丰富的 Laravel 开发者,拥有 4-6 年的经验。获得 160 小时的专业服务和 15 天的免费试用期。立即预约电话!

Bacancy
Lucky Media logo

Lucky Media

立即获得幸运 - 拥有十年以上经验,是 Laravel 开发的理想选择!

Lucky Media
Lunar: Laravel E-Commerce logo

Lunar: Laravel 电子商务

Laravel 的电子商务。一个开源软件包,将现代无头电子商务功能的强大功能带入 Laravel。

Lunar: Laravel 电子商务
LaraJobs logo

LaraJobs

官方 Laravel 工作板

LaraJobs
SaaSykit: Laravel SaaS Starter Kit logo

SaaSykit:Laravel SaaS 启动工具包

SaaSykit 是一个 Laravel SaaS 启动工具包,包含运行现代 SaaS 所需的所有功能。支付、漂亮的结账、管理面板、用户仪表板、身份验证、现成的组件、统计数据、博客、文档等等。

SaaSykit:Laravel SaaS 启动工具包
Rector logo

Rector

您无缝升级 Laravel、降低成本和加速创新的合作伙伴,助力企业取得成功

Rector
MongoDB logo

MongoDB

通过 MongoDB 和 Laravel 的强大集成来增强您的 PHP 应用程序,使开发人员能够轻松高效地构建应用程序。支持事务、搜索、分析和移动用例,同时使用熟悉的 Eloquent API。探索 MongoDB 灵活、现代的数据库如何改变您的 Laravel 应用程序。

MongoDB
Maska is a Simple Zero-dependency Input Mask Library image

Maska 是一个简单的零依赖输入掩码库

阅读文章
Add Swagger UI to Your Laravel Application image

在 Laravel 应用程序中添加 Swagger UI

阅读文章
Assert the Exact JSON Structure of a Response in Laravel 11.19 image

在 Laravel 11.19 中断言响应的精确 JSON 结构

阅读文章
Build SSH Apps with PHP and Laravel Prompts image

使用 PHP 和 Laravel 提示构建 SSH 应用程序

阅读文章
Building fast, fuzzy site search with Laravel and Typesense image

使用 Laravel 和 Typesense 构建快速、模糊的网站搜索

阅读文章
Add Comments to your Laravel Application with the Commenter Package image

使用 Commenter 包为 Laravel 应用程序添加评论

阅读文章