PHP的InfluxDB客户端库使用

举报
lxw1844912514 发表于 2022/09/25 01:08:35 2022/09/25
【摘要】 这是一个influxdb的1.新版本客户端GitHub - influxdata/influxdb-php: influxdb-php: A PHP Client for InfluxDB, a time series database 如果使用的是2.x版本,请使用找个客户端 GitHub - influxdata/influxdb...

这是一个influxdb的1.新版本客户端
GitHub - influxdata/influxdb-php: influxdb-php: A PHP Client for InfluxDB, a time series database
如果使用的是2.x版本,请使用找个客户端

GitHub - influxdata/influxdb-client-php: InfluxDB (v2+) Client Library for PHP

概览

一个易于使用的库,用于将inflexdb与PHP结合使用。由 @thecodeassassin, @gianarb. 维护。inflexdbphp库是为了拥有python influxdb客户机的php端口而创建的。这样,不同编程语言之间将有一个通用的抽象库。

安装

可以使用composer完成安装:

$ composer require influxdb/influxdb-php
 

PHP 5.3 和 PHP 5.4 用户请zhu'yi
如果使用php5.3和php5.4,0.1.x版本仍然受支持(bug修复和新版本修复)。0.1.x分支将在php5.3和php5.4上运行,但不包含1.0.0版本所具有的所有特性,例如UDP支持。

开始使用

初始化一个新的客户端对象

$client = new InfluxDB\Client($host, $port);
 

这将创建一个新的客户机对象,您可以使用它来读写InfluxDB的点。还可以从DSN(数据源名称)创建客户端:


  
  1. // 直接获取数据库句柄
  2. $database = InfluxDB\Client::fromDSN(sprintf('influxdb://user:pass@%s:%s/%s', $host, $port, $dbname));
  3. // 使用客户端检索其他数据库
  4. $client = $database->getClient();

重要提示:当使用DSN时,不要忘记urlencode()password(和username),尤其是当它包含非字母数字字符时。不这样做可能会引发异常。

读取数据

要从InfluxDB获取记录,可以直接在数据库上执行查询:


  
  1. // 选择数据库
  2. $database = $client->selectDB('influx_test_db');
  3. //执行查询将生成resultset对象
  4. $result = $database->query('select * from test_metric LIMIT 5');
  5. // 从resultset获取点生成一个数组
  6. $points = $result->getPoints();

也可以使用QueryBuilder对象。这个类简化了构建查询的过程。


  
  1. // 使用查询生成器检索点
  2. $result = $database->getQueryBuilder()
  3. ->select('cpucount')
  4. ->from('test_metric')
  5. ->limit(2)
  6. ->offset(2)
  7. ->getResultSet()
  8. ->getPoints();
  9. //从QueryBuilder获取查询
  10. $query = $database->getQueryBuilder()
  11. ->select('cpucount')
  12. ->from('test_metric')
  13. ->where(["region = 'us-west'"])
  14. ->getQuery();

确保在对字符串执行where查询时输入单引号;否则InfluxDB将返回空结果。

您可以从客户端获取最后执行的查询:


  
  1. // 使用 getLastQuery() 获取方法
  2. $lastQuery = $client->getLastQuery();
  3. // 或直接访问静态变量:
  4. $lastQuery = Client::lastQuery;

使用超时读取数据

在生产环境中,如果您正在查询InfluxDB以生成对web或API请求的响应,则可能需要为InfluxDB调用设置一个特定的超时,而不是让它们无限期运行的默认值。


  
  1. // 使用5秒超时获取数据库
  2. $database = InfluxDB\Client::fromDSN(sprintf('influxdb://user:pass@%s:%s/%s', $host, $port, $dbname), 5);

写入数据

通过向数据库上的writePoints方法提供一个点数组来写入数据:


  
  1. // 创建点阵列
  2. $points = array(
  3. new Point(
  4. 'test_metric', // name of the measurement
  5. 0.64, // the measurement value
  6. ['host' => 'server01', 'region' => 'us-west'], // optional tags
  7. ['cpucount' => 10], // optional additional fields
  8. 1435255849 // Time precision has to be set to seconds!
  9. ),
  10. new Point(
  11. 'test_metric', // name of the measurement
  12. 0.84, // the measurement value
  13. ['host' => 'server01', 'region' => 'us-west'], // optional tags
  14. ['cpucount' => 10], // optional additional fields
  15. 1435255849 // Time precision has to be set to seconds!
  16. )
  17. );
  18. // 我们正在编写unix时间戳,它有第二个精度
  19. $result = $database->writePoints($points, Database::PRECISION_SECONDS);

在将测量值写入InfluxDB时,可以添加多个字段。point类允许您轻松地将数据成批写入influxDB。

度量的名称和值是必需的。其他字段、标记和时间戳是可选的。InfluxDB将当前时间作为默认时间戳。

也可以在不指定多个测量值的情况下写入多个字段:


  
  1. $points = [
  2. new Point(
  3. 'instance', // the name of the measurement
  4. null, // measurement value
  5. ['host' => 'server01', 'region' => 'us-west'], // measurement tags
  6. ['cpucount' => 10, 'free' => 1], // measurement fields
  7. exec('date +%s%N') // timestamp in nanoseconds on Linux ONLY
  8. ),
  9. new Point(
  10. 'instance', // the name of the measurement
  11. null, // measurement value
  12. ['host' => 'server01', 'region' => 'us-west'], // measurement tags
  13. ['cpucount' => 10, 'free' => 2], // measurement fields
  14. exec('date +%s%N') // timestamp in nanoseconds on Linux ONLY
  15. )
  16. ];

使用udp写入数据

首先,将InfluxDB主机设置为支持传入的UDP套接字:

[udp]
  enabled = true
  bind-address = ":4444"
  database = "test_db"

然后,在客户端中配置UDP驱动程序:


  
  1. // set the UDP driver in the client
  2. $client->setDriver(new \InfluxDB\Driver\UDP($client->getHost(), 4444));
  3. $points = [
  4. new Point(
  5. 'test_metric',
  6. 0.84,
  7. ['host' => 'server01', 'region' => 'us-west'],
  8. ['cpucount' => 10],
  9. exec('date +%s%N') // this will produce a nanosecond timestamp on Linux ONLY
  10. )
  11. ];
  12. // now just write your points like you normally would
  13. $result = $database->writePoints($points);

或者只需使用DSN(数据源名称)使用UDP发送指标:


  
  1. // get a database object using a DSN (Data Source Name)
  2. $database = InfluxDBClient::fromDSN('udp+influxdb://username:pass@localhost:4444/test123');
  3. // write your points
  4. $result = $database->writePoints($points);

注意:重要的是要注意使用UDP时精度将被忽略。使用UDP将数据写入InfluxDB时,应始终使用纳秒精度。

时间戳精度

向点对象添加时间戳时,提供正确的精度非常重要。这是因为如果以秒为单位指定时间戳,并且设置了默认(纳秒)精度,则输入的时间戳将无效。


  
  1. // Points will require a nanosecond precision (this is default as per influxdb standard)
  2. $newPoints = $database->writePoints($points);
  3. // Points will require second precision
  4. $newPoints = $database->writePoints($points, Database::PRECISION_SECONDS);
  5. // Points will require microsecond precision
  6. $newPoints = $database->writePoints($points, Database::PRECISION_MICROSECONDS);

请注意,exec('date+%s%N')在MacOS下不工作;您可以使用PHP的microtime来获得微秒精度的时间戳,如下所示:


  
  1. list($usec, $sec) = explode(' ', microtime());
  2. $timestamp = sprintf('%d%06d', $sec, $usec*1000000);

创建数据库

当添加了一个默认的数据库保留策略时。此保留策略没有持续时间,因此将用内存刷新数据。

使用此库,可以在创建数据库时轻松提供保留策略:


  
  1. // create the client
  2. $client = new \InfluxDB\Client($host, $port, '', '');
  3. // select the database
  4. $database = $client->selectDB('influx_test_db');
  5. // create the database with a retention policy
  6. $result = $database->create(new RetentionPolicy('test', '5d', 1, true));
  7. // check if a database exists then create it if it doesn't
  8. $database = $client->selectDB('test_db');
  9. if (!$database->exists()) {
  10. $database->create(new RetentionPolicy('test', '1d', 2, true));
  11. }

您还可以更改保留策略:

$database->alterRetentionPolicy(new RetentionPolicy('test', '2d', 5, true));
 

展示数据

$result = $database->listRetentionPolicies();
 

添加更多保留策略

$result = $database->createRetentionPolicy(new RetentionPolicy('test2', '30d', 1, true));
 

客户端方法

客户端方法有些函数对于数据库来说过于通用。因此,在客户端中可以使用:


  
  1. // list users
  2. $result = $client->listUsers();
  3. // list databases
  4. $result = $client->listDatabases();

管理员方法


  
  1. // add a new user without privileges
  2. $client->admin->createUser('testuser123', 'testpassword');
  3. // add a new user with ALL cluster-wide privileges
  4. $client->admin->createUser('admin_user', 'password', InfluxDBClientAdmin::PRIVILEGE_ALL);
  5. // drop user testuser123
  6. $client->admin->dropUser('testuser123');

列出所有用户


  
  1. // show a list of all users
  2. $results = $client->admin->showUsers();
  3. // show users returns a ResultSet object
  4. $users = $results->getPoints();

取消授权和授权

可以在数据库级别和群集范围内授予权限。要在数据库上授予用户特定的权限,请提供数据库对象或数据库名称。


  
  1. // grant permissions using a database object
  2. $database = $client->selectDB('test_db');
  3. $client->admin->grant(\InfluxDB\Client\Admin::PRIVILEGE_READ, 'testuser123', $database);
  4. // give user testuser123 read privileges on database test_db
  5. $client->admin->grant(InfluxDBClientAdmin::PRIVILEGE_READ, 'testuser123', 'test_db');
  6. // revoke user testuser123's read privileges on database test_db
  7. $client->admin->revoke(InfluxDBClientAdmin::PRIVILEGE_READ, 'testuser123', 'test_db');
  8. // grant a user cluster-wide privileges
  9. $client->admin->grant(InfluxDBClientAdmin::PRIVILEGE_READ, 'testuser123');
  10. // Revoke an admin's cluster-wide privileges
  11. $client->admin->revoke(InfluxDBClientAdmin::PRIVILEGE_ALL, 'admin_user');

待完成功能

  • 更多单元测试

*增加文档(wiki?)

*向查询生成器添加更多功能

*向保留策略添加验证

文章来源: blog.csdn.net,作者:lxw1844912514,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/lxw1844912514/article/details/126784711

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。