PHP API 基准测试对比指南
核心测试类别
框架性能对比
Laravel vs Symfony vs Phalcon vs Slim
- 测试 REST API 响应时间
- 测试 GraphQL 端点性能
- 中间件堆栈影响
版本性能对比
PHP 7.4 → 8.0 → 8.1 → 8.2 → 8.3
- JIT 编译器影响
- 类型系统优化
- match 表达式性能
配置对比
- OPcache 开启/关闭
- 不同的 PHP-FPM 进程数
- JIT 配置参数(缓冲区大小、触发频率)
基准测试工具
推荐工具链
# 1. Apache Bench (AB) ab -n 10000 -c 100 http://your-api.com/endpoint # 2. wrk (更现代) wrk -t12 -c400 -d30s http://your-api.com/endpoint # 3. Siege siege -c100 -t60s http://your-api.com/endpoint # 4. k6 (JS脚本支持) k6 run --vus 100 --duration 30s benchmark.js
PHP 专用工具
// 简单基准测试类
class PerformanceBenchmark {
private $startTime;
private $memoryStart;
public function start() {
$this->startTime = microtime(true);
$this->memoryStart = memory_get_usage();
}
public function end($label) {
$time = microtime(true) - $this->startTime;
$memory = memory_get_usage() - $this->memoryStart;
echo sprintf("[%s] Time: %.4fs | Memory: %d bytes\n",
$label, $time, $memory);
}
}
测试指标
关键指标
- RPS (Requests Per Second) - 每秒请求数
- P95/P99 延迟 - 95%/99% 百分位响应时间
- 吞吐量 - 成功请求/失败请求比例
- 资源消耗 - CPU、内存、IO
示例测试脚本
#!/bin/bash
# benchmark.sh
ENDPOINTS=(
"GET http://localhost/api/users"
"POST http://localhost/api/users"
"GET http://localhost/api/users/1"
)
for endpoint in "${ENDPOINTS[@]}"; do
echo "Testing: $endpoint"
wrk -t12 -c400 -d60s "$endpoint"
echo "---"
done
环境标准化
必须控制变量
# 测试环境配置 hardware: cpu: "相同核心数" ram: "相同内存大小" disk: "SSD优先" software: php_version: "准确指定" web_server: "Nginx/Apache" opcache: "统一配置" network: local_testing: "避免网络延迟" keepalive: "统一开启/关闭"
常见测试陷阱
未预热
// 预热代码
for ($i = 0; $i < 100; $i++) {
file_get_contents("http://localhost/api/prepare");
}
内存泄漏
# 监控内存使用
while true; do
ps -o pid,%cpu,%mem,rss,command -p $(pgrep -f php-fpm) | tail -n +2
sleep 1
done
SQL 查询差异
// 使用统一的数据库配置
define('DB_DSN', 'mysql:host=localhost;dbname=benchmark');
define('DB_USER', 'bench_user');
define('DB_PASS', 'bench_pass');
报告生成
格式化输出示例
Benchmark Results (1000 requests, 100 concurrent)
=================================================
| Framework | RPS | P95 (ms) | P99 (ms) | Memory |
|-----------|---------|----------|----------|--------|
| Laravel | 450 | 245 | 380 | 32MB |
| Slim | 1200 | 89 | 150 | 8MB |
| Phalcon | 1800 | 62 | 110 | 6MB |
| Plain PHP | 2500 | 45 | 78 | 4MB |
进阶技巧
分布式测试
# 使用多台机器压测
seq 1 5 | xargs -P5 -I{} ssh worker-{} \
"wrk -t12 -c400 -d60s http://master-node/api"
数据库基准
-- 测试 API 涉及的所有查询 EXPLAIN ANALYZE SELECT * FROM users WHERE id = 1;
缓存策略对比
// 测试不同缓存方案
$strategies = ['none', 'file', 'redis', 'apcu'];
foreach ($strategies as $strategy) {
// 配置缓存
Benchmark::run($strategy);
}
最佳实践清单
- [ ] 使用最新稳定版 PHP
- [ ] 开启 OPcache 并配置优化
- [ ] 关闭 Xdebug 扩展
- [ ] 使用 Production 模式
- [ ] 预热应用和数据库连接池
- [ ] 多次运行取平均值
- [ ] 记录完整的环境配置
- [ ] 测试真实业务场景,而非空路由
需要我针对某个具体框架或场景展开详细测试方案吗?
