k6 PHP API 并发测试
对,k6 很适合你的 TP6 / PHP API 并发测试。它的优势是可以用 JavaScript 描述压测场景,比 ab 更适合模拟真实业务。
最简单的 GET 压测
安装 k6 后:
k6 run test.jstest.js:
import http from 'k6/http';export const options = {
vus: 100,
duration: '30s',
};
export default function () {
http.get('http://127.0.0.1/api/test');
}
这表示:
100 个虚拟用户
持续 30 秒
不断请求
/api/test
更推荐:逐步增加并发
测试 TP6 接口时,我更建议这样:
import http from 'k6/http';import { check } from 'k6';
export const options = {
stages: [
{ duration: '10s', target: 50 },
{ duration: '20s', target: 100 },
{ duration: '20s', target: 500 },
{ duration: '20s', target: 1000 },
{ duration: '10s', target: 0 },
],
thresholds: {
http_req_failed: ['rate<0.01'],
http_req_duration: ['p(95)<500'],
},
};
export default function () {
const res = http.get('http://127.0.0.1/api/test');
check(res, {
'HTTP 200': (r) => r.status === 200,
});
}
然后:
k6 run test.js最终重点看:
http_req_durationhttp_req_failed
http_reqs
vus
尤其是:
p(95)p(99)
例如:
http_req_duration:avg=120ms
p(95)=280ms
p(99)=520ms
说明 95% 请求在 280ms 以内,但最慢的 1% 已经明显变慢。
POST JSON 接口
你的 TP6 API 如果是 POST,可以直接这样:
import http from 'k6/http';export const options = {
vus: 100,
duration: '30s',
};
export default function () {
const url = 'http://127.0.0.1/api/user/login';
const payload = JSON.stringify({
username: 'test',
password: '123456',
});
const params = {
headers: {
'Content-Type': 'application/json',
},
};
http.post(url, payload, params);
}
带 Cookie / Token
例如登录后测试业务接口:
const params = {headers: {
'Authorization': 'Bearer xxxxxxxxx',
'Content-Type': 'application/json',
},
};
http.get(
'http://127.0.0.1/api/user/info',
params
);
如果是 TP6 Session,也可以模拟 Cookie:
const params = {headers: {
'Cookie': 'PHPSESSID=xxxxxxxxxxxxxxxx',
},
};
http.get(
'http://127.0.0.1/api/user/info',
params
);
如果你是测试 TP6 + Swoole
我建议不要一上来就 1000 并发。
可以按照:
10↓
50
↓
100
↓
200
↓
500
↓
1000
↓
2000
逐级测试。
同时观察服务器:
tophtopMySQL:
SHOW PROCESSLIST;Redis:
redis-cli info以及 Swoole 的:
worker CPUworker memory
request latency
连接数
协程数量
这样才能判断到底是 PHP、Swoole、MySQL、Redis 还是连接数先达到瓶颈。
如果你愿意,我可以直接给你做一个 “TP6 API 专用 k6 压测脚本”,包含 登录 → 获取 Session/Token → 并发访问接口 → 统计 QPS、P95、P99、错误率。