PHP需用curl向Powerdrill的/v1/query端点发JSON POST请求,响应为无data包裹的rows/columns结构,须手动映射为关联数组并处理时间、数字精度及NULL值后供前端图表库使用。

PHP 本身不渲染图表,也不直接连接 Powerdrill;它只负责取数、转格式、交到前端图表库手上——中间这一步最容易出错。
Powerdrill 查询必须走 HTTP POST + JSON body
Powerdrill 没有 PHP 扩展,也没有 powerdrill_query() 这类函数。你看到的任何“封装好的类”都是第三方非官方实现,稳定性不可控。唯一可靠路径是原生 curl 发请求:
- 目标 URL 是
https://your-powerdrill-host:8443/v1/query,不是/api或/query根路径 - POST body 必须是 JSON,且顶层字段只能是
query,例如:{"query": "SELECT COUNT(*) FROM events"}—— 写成{"sql": "..."}或{"statement": "..."}直接 400 - 必须显式设置请求头:
Content-Type: application/json和Authorization: Bearer <token></token>,漏掉任一 header 都会返回 415 或 401
响应结构不是标准 data.rows,而是 rows/columns 平级
Powerdrill 返回的 JSON 没有外层 data 包裹,直接是 {"rows": [...], "columns": [...]}。如果你用惯了 Laravel 的 response()->json() 或前端 axios 默认解析,容易误以为数据在 data.rows 里。
-
rows是二维数组:[["user_123", 42], ["user_456", 18]],不是对象数组 -
columns是字符串列表:["user_id", "cnt"],需手动 zip 到每行生成关联结构(如供 Chart.js 使用) - 空结果时
rows是空数组[],不是null或缺失字段,别用isset($res->data)判空
PHP 取数后怎么喂给 Chart.js 或 ECharts
别在 PHP 里拼 HTML 或内联 JS。最干净的做法是写一个纯数据接口,比如 /api/powerdrill-stats.php,只输出转换后的 JSON:
立即学习“PHP免费学习笔记(深入)”;
<?php
$ch = curl_init('https://pd.example.com:8443/v1/query');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(['query' => 'SELECT day, SUM(revenue) FROM sales GROUP BY day ORDER BY day']));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Authorization: Bearer abc123'
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
// 转成前端能直接用的结构
$data = [];
foreach ($response['rows'] as $row) {
$data[] = ['day' => $row[0], 'revenue' => (float)$row[1]];
}
header('Content-Type: application/json');
echo json_encode($data);
?>
前端用 fetch('/api/powerdrill-stats.php') 拿到的就是标准键名数组,可直喂 Chart.js 的 labels 和 data。
时间字段和数字精度容易被忽略
Powerdrill 返回的时间戳默认是微秒级 Unix 时间(如 1712972345123456),PHP json_decode 会转成 float,再转 JSON 可能丢失精度。数字列也可能因类型推断变成科学计数法字符串。
- 时间列建议在 SQL 里显式转成字符串:
format_datetime(utcnow(), 'yyyy-MM-dd HH:mm'),避免前端解析混乱 - 整数列强制类型转换:
(int)$row[2],防止"123456789012345"被 JS 当作 number 溢出 - 若查询含
NULL,Powerdrill 返回null值,PHPjson_encode会保留,但 Chart.js 不接受null在data数组中,得提前替换为0或NaN



















