本文目录导读:

在 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 会记录错误并通知你,这通常意味着该功能不可用。
最佳实践建议
- 区分 Liveness 与 Readiness:
- Liveness:进程是否活着?(只查 PHP 是否响应)。
- Readiness:是否能服务流量?(检查数据库、队列等依赖是否连接成功)。
- 设置超时:健康检查脚本里的数据库查询一定要设置短超时(如 2 秒),否则数据库假死会导致健康检查脚本挂起,从而误报。
- 使用事务测试(高级):对于核心功能,可以写一个“只读”或“回滚”的事务测试(写入后回滚),确保数据库可写。
如果你是开发人员,主要用 php -l 检查语法,用 php -f 启动服务跑通关键流程;如果你是运维人员,重点是用 HTTP 探针(返回 200/503)加上数据库/Redis 的连通性检测,配合外部的 Uptime 监控器。