本文目录导读:

在 PHP 中进行持续性能测试,我推荐以下几种方法和工具组合:
基准测试框架
PHPBench
// benchmark.php
use PhpBench\Benchmark\Metadata\Annotations\BeforeMethods;
use PhpBench\Benchmark\Metadata\Annotations\AfterMethods;
use PhpBench\Benchmark\Metadata\Annotations\ParamProviders;
class ArrayBench
{
/**
* @Revs(1000)
* @Iterations(5)
*/
public function benchArrayMerge()
{
$result = [];
for ($i = 0; $i < 1000; $i++) {
$result = array_merge($result, [$i]);
}
}
/**
* @Revs(1000)
* @Iterations(5)
*/
public function benchArrayPush()
{
$result = [];
for ($i = 0; $i < 1000; $i++) {
$result[] = $i;
}
}
}
运行:
vendor/bin/phpbench run benchmark.php --report=default
持续集成集成
GitHub Actions 配置
# .github/workflows/performance.yml
name: Performance Tests
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
benchmark:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.2'
extensions: mbstring, intl
- name: Install dependencies
run: composer install --prefer-dist
- name: Run benchmarks
run: vendor/bin/phpbench run --report=aggregate --output=json > bench-results.json
- name: Compare with previous
uses: actions/upload-artifact@v3
with:
name: benchmark-results
path: bench-results.json
性能监控工具
使用 Xdebug 分析
# 生成性能分析文件 XDEBUG_MODE=profile php script.php # 使用 PhpStorm 或 Webgrind 分析
使用 Blackfire
# .github/workflows/blackfire.yml
name: Blackfire Performance
on:
push:
branches: [main]
jobs:
blackfire:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup PHP
uses: shivammathur/setup-php@v2
- name: Blackfire
uses: blackfireio/integration@v4
with:
client-id: ${{ secrets.BLACKFIRE_CLIENT_ID }}
client-token: ${{ secrets.BLACKFIRE_CLIENT_TOKEN }}
数据库性能测试
// DatabaseBench.php
class DatabaseBench
{
private $pdo;
public function setUp(): void
{
$this->pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
}
/**
* @Revs(100)
* @Iterations(10)
*/
public function benchQueryWithIndex()
{
$stmt = $this->pdo->prepare('SELECT * FROM users WHERE email = ?');
$stmt->execute(['test@example.com']);
$stmt->fetchAll();
}
/**
* @Revs(100)
* @Iterations(10)
*/
public function benchQueryWithoutIndex()
{
$stmt = $this->pdo->prepare('SELECT * FROM users WHERE name LIKE ?');
$stmt->execute(['%test%']);
$stmt->fetchAll();
}
}
内存和负载测试
// MemoryBench.php
class MemoryBench
{
/**
* @Revs(100)
* @Iterations(5)
*/
public function benchLargeArray()
{
$data = range(1, 100000);
// 模拟大数据处理
return array_sum($data);
}
/**
* @Revs(100)
* @Iterations(5)
*/
public function benchMemoryEfficient()
{
$sum = 0;
for ($i = 1; $i <= 100000; $i++) {
$sum += $i;
}
return $sum;
}
}
自动化测试脚本
// perf-test.sh
#!/bin/bash
# 设置基准基线
BASELINE_FILE=".benchmark/baseline.json"
CURRENT_RESULTS=".benchmark/current.json"
# 运行基准测试
run_benchmarks() {
vendor/bin/phpbench run \
--report=aggregate \
--output=json \
--output-file=$CURRENT_RESULTS
}
# 比较结果
compare_results() {
if [ -f "$BASELINE_FILE" ]; then
php .scripts/compare_benchmarks.php \
--baseline=$BASELINE_FILE \
--current=$CURRENT_RESULTS \
--threshold=5 # 5% 阈值
else
cp $CURRENT_RESULTS $BASELINE_FILE
fi
}
run_benchmarks
compare_results
性能回归检测
// compare_benchmarks.php
<?php
class BenchmarkComparator
{
public function compare($baseline, $current, $threshold = 5)
{
$regressions = [];
foreach ($current as $bench => $metrics) {
if (isset($baseline[$bench])) {
$change = (($metrics['mean'] - $baseline[$bench]['mean']) / $baseline[$bench]['mean']) * 100;
if ($change > $threshold) {
$regressions[$bench] = [
'old' => $baseline[$bench]['mean'],
'new' => $metrics['mean'],
'regression' => round($change, 2)
];
}
}
}
return $regressions;
}
}
最佳实践建议
建立性能基线
# performance-baseline.yml
benchmarks:
common-operations:
- name: "数据库查询 - 无缓存"
threshold_ms: 100
- name: "API响应时间"
threshold_ms: 200
- name: "页面加载时间"
threshold_ms: 500
监控配置
// config/performance.php
return [
'monitoring' => [
'enabled' => true,
'baseline_file' => storage_path('app/performance/baseline.json'),
'threshold_percentage' => 10,
'notification_email' => 'team@example.com',
'metrics' => [
'response_time',
'memory_usage',
'database_queries',
'cache_hit_rate'
]
]
];
使用 Docker 进行一致性测试
# Dockerfile
FROM php:8.2-cli
RUN apt-get update && apt-get install -y \
git \
unzip \
&& docker-php-ext-install pdo_mysql opcache
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
WORKDIR /app
COPY . .
RUN composer install --prefer-dist
CMD ["vendor/bin/phpbench", "run", "--report=default"]
核心建议:
- 在 CI/CD 中设置性能测试自动化
- 建立性能基线并监控回归
- 使用多种工具(代码级、HTTP级别、数据库级别)
- 记录性能数据并生成趋势报告
- 设置合理的性能阈值和告警机制