PHP 怎么持续性能测试

wen PHP项目 2

本文目录导读:

PHP 怎么持续性能测试

  1. 基准测试框架
  2. 持续集成集成
  3. 性能监控工具
  4. 数据库性能测试
  5. 内存和负载测试
  6. 自动化测试脚本
  7. 性能回归检测
  8. 最佳实践建议
  9. 使用 Docker 进行一致性测试

在 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级别、数据库级别)
  • 记录性能数据并生成趋势报告
  • 设置合理的性能阈值和告警机制

抱歉,评论功能暂时关闭!