PHP 連接器
php-tdengine
這是 開發組成員, 框架作者宇潤開發的 php TDengine 客戶端擴展,依賴 libtaos。
源代碼:
依賴
-
>= 7.4
-
>= 4.8 (可選)
-
TDengine客戶端 >= 2.0
特性列表
- 參數綁定
- 支持 Swoole 協程化
- 主流操作系統支持:Windows、Linux、MacOS
- 測試用例覆蓋
編譯安裝
下載代碼并解壓:
curl -L -o php-tdengine.tar.gz //github.com/Yurunsoft/php-tdengine/archive/refs/tags/v1.0.2.tar.gz \
&& mkdir php-tdengine \
&& tar -xzf php-tdengine.tar.gz -C php-tdengine --strip-components=1
版本
v1.0.2可替換為任意更新的版本,可在 Release 中查看最新版本。
非 Swoole 環境:
phpize && ./configure && make -j && make install
手動指定 tdengine 目錄:
phpize && ./configure --with-tdengine-dir=/usr/local/Cellar/tdengine/2.4.0.0 && make -j && make install
--with-tdengine-dir=后跟上 tdengine 目錄。 適用于默認找不到的情況,或者 MacOS 系統用戶。
Swoole 環境:
phpize && ./configure --enable-swoole && make -j && make install
啟用擴展:
方法一:在 php.ini 中加入 extension=tdengine
方法二:運行帶參數 php -dextension=tdengine test.php
PHP 代碼編寫
所有錯誤都會拋出異常:
TDengine\Exception\TDengineException
基本:
use TDengine\Connection;
// 獲取擴展版本號
var_dump(\TDengine\EXTENSION_VERSION);
// 設置客戶端選項
\TDengine\setOptions([
\TDengine\TSDB_OPTION_LOCALE => 'en_US.UTF-8', // 區域
\TDengine\TSDB_OPTION_CHARSET => 'UTF-8', // 字符集
\TDengine\TSDB_OPTION_TIMEZONE => 'Asia/Shanghai', // 時區
\TDengine\TSDB_OPTION_CONFIGDIR => '/etc/taos', // 配置目錄
\TDengine\TSDB_OPTION_SHELL_ACTIVITY_TIMER => 3, // shell 活動定時器
]);
// 獲取客戶端版本信息
var_dump(\TDengine\CLIENT_VERSION);
var_dump(\TDengine\getClientInfo());
// 以下值都是默認值,不改可以不傳
$host = '127.0.0.1';
$port = 6030;
$user = 'root';
$pass = 'taosdata';
$db = null;
// 實例化
$connection = new Connection($host, $port, $user, $pass, $db);
// 連接
$connection->connect();
// 獲取連接參數
$connection->getHost();
$connection->getPort();
$connection->getUser();
$connection->getPass();
$connection->getDb();
// 獲取服務端信息
$connection->getServerInfo();
// 選擇默認數據庫
$connection->selectDb('db1');
// 關閉連接
$connection->close();
查詢:
// 查詢
$resource = $connection->query($sql); // 支持查詢和插入
// 獲取結果集時間戳字段的精度,0 代表毫秒,1 代表微秒,2 代表納秒
$resource->getResultPrecision();
// 獲取所有數據
$resource->fetch();
// 獲取一行數據
$resource->fetchRow();
// 獲取字段數組
$resource->fetchFields();
// 獲取列數
$resource->getFieldCount();
// 獲取影響行數
$resource->affectedRows();
// 獲取 SQL 語句
$resource->getSql();
// 獲取連接對象
$resource->getConnection();
// 關閉資源(一般不需要手動關閉,變量銷毀時會自動釋放)
$resource->close();
參數綁定:
// 查詢
$stmt = $connection->prepare($sql); // 支持查詢和插入,參數用?占位
// 設置表名和標簽
$stmt->setTableNameTags('表名', [
// 支持格式同參數綁定
[TDengine\TSDB_DATA_TYPE_INT, 36],
]);
// 綁定參數方法1
$stmt->bindParams(
// [字段類型, 值]
[TDengine\TSDB_DATA_TYPE_TIMESTAMP, $time1],
[TDengine\TSDB_DATA_TYPE_INT, 36],
[TDengine\TSDB_DATA_TYPE_FLOAT, 44.0],
);
// 綁定參數方法2
$stmt->bindParams([
// ['type' => 字段類型, 'value' => 值]
['type' => TDengine\TSDB_DATA_TYPE_TIMESTAMP, 'value' => $time2],
['type' => TDengine\TSDB_DATA_TYPE_INT, 'value' => 36],
['type' => TDengine\TSDB_DATA_TYPE_FLOAT, 'value' => 44.0],
]);
// 執行 SQL,返回 Resource,使用方法同 query() 返回值
$resource = $stmt->execute();
// 獲取 SQL 語句
$stmt->getSql();
// 獲取連接對象
$stmt->getConnection();
// 關閉(一般不需要手動關閉,變量銷毀時會自動釋放)
$stmt->close();
字段類型:
| 參數名稱 | 說明 |
|---|---|
TDengine\TSDB_DATA_TYPE_NULL |
null |
TDengine\TSDB_DATA_TYPE_BOOL |
bool |
TDengine\TSDB_DATA_TYPE_TINYINT |
tinyint |
TDengine\TSDB_DATA_TYPE_SMALLINT |
smallint |
TDengine\TSDB_DATA_TYPE_INT |
int |
TDengine\TSDB_DATA_TYPE_BIGINT |
bigint |
TDengine\TSDB_DATA_TYPE_FLOAT |
float |
TDengine\TSDB_DATA_TYPE_DOUBLE |
double |
TDengine\TSDB_DATA_TYPE_BINARY |
binary |
TDengine\TSDB_DATA_TYPE_TIMESTAMP |
timestamp |
TDengine\TSDB_DATA_TYPE_NCHAR |
nchar |
TDengine\TSDB_DATA_TYPE_UTINYINT |
utinyint |
TDengine\TSDB_DATA_TYPE_USMALLINT |
usmallint |
TDengine\TSDB_DATA_TYPE_UINT |
uint |
TDengine\TSDB_DATA_TYPE_UBIGINT |
ubigint |
在框架中使用
- imi 框架請看:
tdengine-restful-connector
封裝了 TDengine 的 RESTful 接口,可以使用 PHP 輕松地操作 TDengine 的數據插入和查詢了。
此項目支持在 PHP >= 7.0 的項目中使用。
支持在 ThinkPHP、Laravel、Swoole、imi 等項目中使用
在 Swoole 環境中支持協程化,不會阻塞!
Github:
安裝
composer require yurunsoft/tdengine-restful-connector
使用
使用連接管理器:
// 增加名稱為 test 的連接配置
\Yurun\TDEngine\TDEngineManager::setClientConfig('test', new \Yurun\TDEngine\ClientConfig([
// 'host' => '127.0.0.1',
// 'hostName' => '',
// 'port' => 6041,
// 'user' => 'root',
// 'password' => 'taosdata',
// 'db' => 'database'
// 'ssl' => false,
// 'timestampFormat' => \Yurun\TDEngine\Constants\TimeStampFormat::LOCAL_STRING,
// 'keepAlive' => true,
]));
// 設置默認數據庫為test
\Yurun\TDEngine\TDEngineManager::setDefaultClientName('test');
// 獲取客戶端對象(\Yurun\TDEngine\Client)
$client = \Yurun\TDEngine\TDEngineManager::getClient();
直接 new 客戶端:
$client = new \Yurun\TDEngine\Client(new \Yurun\TDEngine\ClientConfig([
// 'host' => '127.0.0.1',
// 'hostName' => '',
// 'port' => 6041,
// 'user' => 'root',
// 'password' => 'taosdata',
// 'db' => 'database'
// 'ssl' => false,
// 'timestampFormat' => \Yurun\TDEngine\Constants\TimeStampFormat::LOCAL_STRING,
// 'keepAlive' => true,
]));
// 通過 sql 方法執行 sql 語句
var_dump($client->sql('create database if not exists db_test'));
var_dump($client->sql('show databases'));
var_dump($client->sql('create table if not exists db_test.tb (ts timestamp, temperature int, humidity float)'));
var_dump($client->sql(sprintf('insert into db_test.tb values(%s,%s,%s)', time() * 1000, mt_rand(), mt_rand() / mt_rand())));
$result = $client->sql('select * from db_test.tb');
$result->getResponse(); // 獲取接口原始返回數據
// 獲取列數據
foreach ($result->getColumns() as $column)
{
$column->getName(); // 列名
$column->getType(); // 列類型值
$column->getTypeName(); // 列類型名稱
$column->getLength(); // 類型長度
}
// 獲取數據
foreach ($result->getData() as $row)
{
echo $row['列名']; // 經過處理,可以直接使用列名獲取指定列數據
}
$result->getStatus(); // 告知操作結果是成功還是失敗;同接口返回格式
$result->getHead(); // 表的定義,如果不返回結果集,則僅有一列“affected_rows”。(從 2.0.17 版本開始,建議不要依賴 head 返回值來判斷數據列類型,而推薦使用 column_meta。在未來版本中,有可能會從返回值中去掉 head 這一項。);同接口返回格式
$result->getRow(); // 表明總共多少行數據;同接口返回格式

