本文目录导读:

针对PHP连接时序数据库(如InfluxDB、TimescaleDB、TDengine等),最常用的方案及代码示例如下:
连接 InfluxDB(最常用)
使用官方客户端(推荐)
composer require influxdata/influxdb-client-php
<?php
require 'vendor/autoload.php';
use InfluxDB2\Client;
use InfluxDB2\Model\Query;
// 连接配置
$client = new Client([
"url" => "http://localhost:8086",
"token" => "your-token",
"org" => "your-org"
]);
// 查询数据
$queryApi = $client->createQueryApi();
$query = 'from(bucket: "your-bucket")
|> range(start: -1h)
|> filter(fn: (r) => r._measurement == "cpu")';
$tables = $queryApi->query($query);
foreach ($tables as $table) {
foreach ($table->records as $record) {
echo "Time: " . $record->getTime() . "\n";
echo "Value: " . $record->getValue() . "\n";
}
}
// 关闭连接
$client->close();
使用原生HTTP API
<?php
function queryInfluxDB($query) {
$url = "http://localhost:8086/query";
$params = [
'db' => 'your-db',
'q' => $query
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url . '?' . http_build_query($params));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Token your-token'
]);
$response = curl_exec($ch);
curl_close($ch);
return json_decode($response, true);
}
// 使用示例
$result = queryInfluxDB('SELECT * FROM cpu WHERE time > now() - 1h');
print_r($result['results'][0]['series'][0]['values']);
连接 TimescaleDB(PostgreSQL扩展)
使用PDO连接(和普通PostgreSQL一样):
<?php
$dsn = 'pgsql:host=localhost;port=5432;dbname=your_db';
$user = 'your_user';
$password = 'your_password';
try {
$pdo = new PDO($dsn, $user, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 查询时序数据(使用 time_bucket 聚合)
$query = "
SELECT
time_bucket('1 minute', time) AS bucket,
AVG(temperature) as avg_temp
FROM sensor_data
WHERE time > NOW() - INTERVAL '24 hours'
GROUP BY bucket
ORDER BY bucket
";
$stmt = $pdo->query($query);
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($results as $row) {
echo "Bucket: " . $row['bucket'] . " | Avg Temp: " . $row['avg_temp'] . "\n";
}
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
连接 TDengine(国产时序数据库)
使用官方扩展(推荐)
# 安装扩展(需要先编译) pecl install tdengine
<?php
// 连接
$conn = td_connect("localhost", 6030, "root", "taosdata", "test", 0);
if (!$conn) {
die("连接失败: " . td_error());
}
// 查询
$sql = "SELECT * FROM sensor_data WHERE ts > NOW - 1h LIMIT 10";
$result = td_query($conn, $sql);
if ($result) {
while ($row = td_fetch_row($result)) {
print_r($row);
}
td_free_result($result);
}
// 关闭连接
td_close($conn);
使用RESTful API
<?php
function queryTDengine($sql) {
$url = "http://localhost:6041/rest/sql";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $sql);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Basic ' . base64_encode('root:taosdata')
]);
$response = curl_exec($ch);
curl_close($ch);
return json_decode($response, true);
}
$result = queryTDengine('SELECT * FROM sensor_data LIMIT 10');
print_r($result['data']);
通用最佳实践
<?php
class TimeSeriesDB {
private $client;
private $type;
public function __construct($type, $config) {
$this->type = $type;
switch ($type) {
case 'influxdb':
// InfluxDB 初始化
break;
case 'timescaledb':
// TimescaleDB 初始化
break;
case 'tdengine':
// TDengine 初始化
break;
}
}
public function query($sql, $params = []) {
// 统一的查询接口
switch ($this->type) {
case 'influxdb':
return $this->queryInflux($sql);
case 'timescaledb':
return $this->queryPG($sql, $params);
case 'tdengine':
return $this->queryTD($sql);
}
}
public function close() {
// 关闭连接
}
}
选择建议
| 时序数据库 | 适用场景 | 连接方式 |
|---|---|---|
| InfluxDB | IoT、监控、实时分析 | 官方client/HTTP API |
| TimescaleDB | 已有PostgreSQL,需要时序能力 | PDO/PostgreSQL扩展 |
| TDengine | 大数据量、高性能场景 | 官方扩展/REST API |
| Prometheus | 监控指标收集 | 通过HTTP API查询 |
如需更具体的示例或遇到连接问题,请提供:
- 使用的时序数据库类型和版本
- 需要查询的数据表结构
- 具体的错误信息