PHP项目时序数据库如何PHP连接查询数据

wen PHP项目 29

本文目录导读:

PHP项目时序数据库如何PHP连接查询数据

  1. 连接 InfluxDB(最常用)
  2. 连接 TimescaleDB(PostgreSQL扩展)
  3. 连接 TDengine(国产时序数据库)
  4. 通用最佳实践
  5. 选择建议

针对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查询

如需更具体的示例或遇到连接问题,请提供:

  1. 使用的时序数据库类型和版本
  2. 需要查询的数据表结构
  3. 具体的错误信息

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