PHP 怎么可用性测试

wen PHP项目 1

本文目录导读:

PHP 怎么可用性测试

  1. 针对线上服务的“存活探针”(Liveness & Readiness)
  2. 运行逻辑级测试(单元测试与服务启动测试)
  3. 并发与性能压力测试(上线前的可用性保障)
  4. 专门的监控系统(自动化)
  5. 最佳实践建议

在 PHP 中进行可用性测试(Availability Testing)通常涉及确保服务持续可访问、响应正常且功能完整,这通常不是指用户在 UI 上的体验测试,而是指运维监控(Health Check)性能压力测试

根据你的具体需求(是监控线上服务,还是上线前的压力测试),以下是几种常见的 PHP 可用性测试方案:


针对线上服务的“存活探针”(Liveness & Readiness)

这是最基础的可用性测试,目的是让负载均衡器或监控系统知道“PHP服务是否还活着”。

A. 简单的 HTTP 心跳文件

  • 做法:在 Web 根目录放置一个 ping.php 文件。
  • <?php
    // 最简单的探针,返回 HTTP 200
    echo 'ok';
  • 测试curl -I https://yourdomain.com/ping.php 如果返回 200,说明 Web 服务器和 PHP 进程正常。

B. 深度健康检查(检测依赖)

如果只检查 ping.php,就算数据库挂了,服务器也可能返回 200,所以需要检测数据库、缓存等依赖。

<?php
// health_check.php
header('Content-Type: application/json');
$checks = [];
$healthy = true;
// 1. 检查 PHP 版本
$checks['php'] = PHP_VERSION;
// 2. 检查数据库连接 (假设使用 PDO)
try {
    $pdo = new PDO('mysql:host=db;dbname=test', 'user', 'pass', [PDO::ATTR_TIMEOUT => 2]);
    $pdo->query('SELECT 1');
    $checks['database'] = 'ok';
} catch (Exception $e) {
    $healthy = false;
    $checks['database'] = 'error: ' . $e->getMessage();
}
// 3. 检查 Redis
try {
    $redis = new Redis();
    $redis->connect('cache', 6379, 2);
    $checks['redis'] = 'ok';
} catch (Exception $e) {
    $healthy = false;
    $checks['redis'] = 'error: ' . $e->getMessage();
}
http_response_code($healthy ? 200 : 503);
echo json_encode([
    'status' => $healthy ? 'ready' : 'unhealthy',
    'checks' => $checks,
    'time'   => date(DATE_ISO8601)
]);

在 Kubernetes 中使用 readinessProbe 时,这个脚本非常有用。


运行逻辑级测试(单元测试与服务启动测试)

这主要用来防止上线后出现致命错误(如类不存在、语法错误、路由无法加载)。

A. 语法与路由检查(上线前执行)

  • 命令行:在 SSH 中执行 php -l <file> 检查语法。
  • 生产环境:使用php -f启动内置服务器,模拟请求。

B. 通过 PHP 脚本进行 API 冒烟测试

编写一个 CLI 脚本,调用关键 API,验证返回码是否为 200。

<?php
// tests/smoke_test.php
$endpoints = [
    '/api/login' => 'POST',
    '/api/users' => 'GET',
    '/api/orders' => 'GET'
];
foreach ($endpoints as $url => $method) {
    $ch = curl_init('http://localhost:8080' . $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_NOBODY, true); // 只获取 HEAD
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
    $status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    if ($status >= 500) {
        exit('Server Error on ' . $url . ': ' . $status);
    }
}
echo "All critical endpoints are healthy.\n";

并发与性能压力测试(上线前的可用性保障)

可用性也包含“在高并发下不崩溃”,虽然 PHP 本身不常做压测,但可以配合工具进行。

A. 使用 Apache Bench (AB)(最常用)

# 100 个并发,总共 1000 个请求
ab -n 1000 -c 100 http://yourdomain.com/
  • Failed requests 为 0,说明没有崩溃。
  • 关注 Requests per second

B. 使用 Locust(Python 编写但可测 PHP)

编写脚本模拟用户注册/登录流程,监控在持续压力下 PHP-FPM 是否会返回 502 Bad Gateway。


专门的监控系统(自动化)

在实际生产环境中,通常通过外部工具定期请求 PHP 服务。

  • UptimeRobot / Pingdom:设置间隔时间(如 5 分钟)请求你的 URL,如果超时(如>5秒)或返回非 2xx 状态码,则触发告警。
  • Prometheus + Blackbox Exporter:黑盒探针,定期探测 HTTP 端点,结合 Grafana 展示可用性百分比(SLA)。
  • Sentry:如果你的 PHP 抛出未捕获异常,Sentry 会记录错误并通知你,这通常意味着该功能不可用。

最佳实践建议

  1. 区分 Liveness 与 Readiness
    • Liveness:进程是否活着?(只查 PHP 是否响应)。
    • Readiness:是否能服务流量?(检查数据库、队列等依赖是否连接成功)。
  2. 设置超时:健康检查脚本里的数据库查询一定要设置短超时(如 2 秒),否则数据库假死会导致健康检查脚本挂起,从而误报。
  3. 使用事务测试(高级):对于核心功能,可以写一个“只读”或“回滚”的事务测试(写入后回滚),确保数据库可写。

如果你是开发人员,主要用 php -l 检查语法,用 php -f 启动服务跑通关键流程;如果你是运维人员,重点是用 HTTP 探针(返回 200/503)加上数据库/Redis 的连通性检测,配合外部的 Uptime 监控器。

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