选择 PHP 压力测试工具 通常意味着痛苦的权衡:流行的负载测试工具都生活在 PHP 之外,所以你最终不得不在 JavaScript、Java 或 XML 等与你的应用所在语言不同的语言中编写场景。这篇指南采取了不同的方法。
我们将涵盖 PHP 应用中的压力测试到底是什么、选择工具时要注意什么、主要选项的比较,以及如何在几分钟内对纯 PHP 或 Laravel 运行你的第一个压力测试——完全不离开你的 Composer 工作流。
压力测试会将你的应用推向超出正常运行极限的边界,以找到它崩溃的点——以及它是如何崩溃的。它能回答单个请求永远无法回答的问题:你的 API 在多少并发用户下才能让响应时间飙升?数据库连接池在负载下是否耗尽?应用是优雅地失败还是直接崩溃?
混淆不同类型的性能测试很容易:
它们重叠很大,大多数工具(包括 VoltTest)都能处理三者中的所有内容。有关每种类型的完整拆解,请参阅性能测试类型。在这篇文章的其余部分,我们将宽泛地使用“压力测试”一词,指将你的 PHP 应用置于现实的并发负载下。
并非每种负载测试工具都适合 PHP 团队。在选择之前,请用以下标准检查它:
第一个标准是 PHP 开发者最常感到不足的地方——以及下面比较中变得有趣的地方。
以下是压力测试 PHP 应用时最常见选项的诚实对比:
工具 | 编写测试语言 | PHP 原生 | Laravel 原生 | 多步场景 | 最适合 |
|---|---|---|---|---|---|
VoltTest | PHP | 是 | 是 | 是 | 需要原生测试、速度快的 PHP/Laravel 团队 |
k6 | JavaScript | 否 | 否 | 是 | 已习惯 JS 的团队 |
JMeter | XML / GUI | 否 | 否 | 是 | 协议广度和复杂企业计划 |
Locust | Python | 否 | 否 | 是 | Python 团队 |
Apache Bench (ab) | CLI 标志 | 否 | 否 | 否 | 快速一次性单端点检查 |
没有单一的“最佳”工具——取决于你的栈:
ab -n 1000 -c 50 单 URL 检查,但无法建模真实用户旅程。php artisan volttest:run <url>),以及你在需要时需要的完整多步场景。接下来的章节将展示它是如何工作的——从纯 PHP 压力测试,到完整 Laravel 场景,再到你可以像 ab 一样单行 CLI 测试。
VoltTest 是一个高性能的 PHP 性能测试 SDK,采用 Golang 引擎作为支撑。它结合了 PHP 的简洁性以及 Go 语言的快速性和并发处理能力,使用户能够借助直观的 API 来定义、运行和分析测试,同时利用 Golang 来高效生成负载。
VoltTest 的核心 SDK 是框架无关的——它适用于任何 PHP 应用,无论 Symfony、WordPress 还是纯 PHP。用 Composer 安装:
composer require volt-test/php-sdk
然后定义场景并运行。以下是一个最小压力测试,命中首页:
stress-test.php
<?php
require 'vendor/autoload.php';
use VoltTest\VoltTest;
// 创建一个新测试
$voltTest = new VoltTest('Homepage Stress Test');
// 配置负载:50 个虚拟用户,逐步增加 10 秒,保持 1 分钟
$voltTest->setVirtualUsers(50)
->setRampUp('10s')
->setDuration('1m');
// 定义包含一个或多个步骤的场景
$scenario = $voltTest->scenario('Browse Homepage');
$scenario->step('Load homepage')
->get('https://your-app.test/')
->validateStatus('Homepage OK', 200);
// 运行测试 —— 传递 true 会将实时报告流式传输到控制台
$voltTest->run(true);
像任何 PHP 脚本一样运行:
php stress-test.php
由于重活发生在 VoltTest 的 Go 引擎上,单台机器就能驱动比纯 PHP 运行器更多并发的虚拟用户,同时你仍然用你已经熟悉的语言编写测试。
如果你在用 Laravel,专用包会建立在核心 SDK 之上,并添加 Laravel 特定的便利功能:Artisan 命令、自动路由发现和 CSRF/ cookie 处理。作为开发依赖安装:
composer require volt-test/laravel-performance-testing --dev
php artisan vendor:publish --tag=volttest-config
用 Artisan 搭建测试(此处省略具体命令输出):
然后定义场景。请注意 extractCsrfToken() —— 包会自动从响应中提取 Laravel 的 CSRF 令牌,所以你不需要手动处理:
<?php
namespaceApp\VoltTests;
use VoltTest\Laravel\Contracts\VoltTestCase;
use VoltTest\Laravel\VoltTestManager;
{
publicfunction define(VoltTestManager $manager): void
{
$manager->target('http://localhost:8000');
$scenario = $manager->scenario();
->expectStatus(200)
->extractCsrfToken();
'email' => 'user@example.com',
'password' => 'password',
'_token' => '${csrf_token}',
])
->expectStatus(302);
}
}
Laravel 包还支持阶段(逐步增加、保持、尖峰、逐步减少)、CSV 数据源(用真实数据驱动测试)以及PHPUnit 集成,这样你的压力测试就能在现有测试套件中运行,并使用 assertVTP95ResponseTime() 等断言。
有时你不想编写测试类——你只想像 ab -n 1000 -c 50 一样猛击一个端点,看看它是否经得住考验。Laravel 包的 volttest:run 命令正是如此,完全没有 ab 的限制。
用 50 个虚拟用户和 1 分钟时间压力测试单个 URL —— 命令会自动检测参数是 URL,所以无需其他配置:
php artisan volttest:run https://api.example.com/health --users=50 --duration=1m
你还可以用内联请求体压力测试经过身份验证的 POST 端点:
php artisan volttest:run https://example.com/api/login \
--users=100 \
--method=POST \
--body='{"email":"test@example.com","password":"secret"}'
有用标志(运行 php artisan volttest:run --help 查看完整列表):
标志 | 用途 |
|---|---|
--users= | 虚拟用户数量 |
--duration= | 运行时长(例如 30s、1m、5m) |
--method= | HTTP 方法 —— GET、POST、PUT、DELETE |
--body= | POST / PUT 的请求体 |
--headers= | 请求头 JSON 字符串 |
--code-status= | 预期 HTTP 状态码(默认 200) |
--stage= | 负载阶段(duration:target),例如 --stage=1m:50 --stage=5m:100 --stage=1m:0 |
--cloud | 在 VoltTest Cloud 上运行测试 |
--stream | 将实时输出流式传输到控制台 |
这给你提供了 Apache Bench 的一行速度,但带有真实虚拟用户行为、百分位指标、逐步阶段,以及通向云规模执行的路径——全部来自单个 Artisan 命令。
压力测试只有当你能解读报告时才有意义。VoltTest 输出看起来像这样:
Performance Report: Homepage Stress Test
----------------------------------------------------------------------
Total Requests: 5000
Success Rate: 99.94%
Requests/Sec (RPS): 346.19
Avg Latency: 74.24ms
P95 Latency: 128.71ms
P99 Latency: 210.05ms
----------------------------------------------------------------------
要注意的内容:
压力测试时,观察 P95 和 P99 在你增加虚拟用户时如何攀升。它们急剧飙升的地方就是你的崩溃点。
有一些错误会让压力测试结果产生误导:
压力测试会告诉你你的 PHP 应用在压力下的表现——在用户以痛苦方式发现之前。正确的工具会消除摩擦:用 VoltTest,你用 PHP 编写测试、通过 Composer 安装,在纯 PHP 或 Laravel 上运行,并读取真实的百分位指标——全部在高性能 Go 引擎上。小规模开始,在暂存环境上运行单个场景,随着负载增加观察 P95 和 P99,并在 CI 中集成测试,这样回归永远不会到达生产环境。