定制 simlux/influxdb-php 二次开发

按需修改功能、优化性能、对接业务系统,提供一站式技术支持

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

simlux/influxdb-php

Composer 安装命令:

composer require simlux/influxdb-php

包简介

InfluxDB client library for PHP

README 文档

README

InfluxDB client library for PHP

Build Status Code Climate Test Coverage

Overview

A easy to use library for using InfluxDB with PHP. Maintained by @thecodeassassin, @gianarb.

The influxdb-php library was created to have php port of the python influxdb client. This way there will be a common abstraction library between different programming languages.

Installation

Installation can be done with composer:

$ composer require influxdb/influxdb-php

NOTE for PHP 5.3 and PHP 5.4 users

If you use either PHP 5.3 and PHP 5.4, the 0.1.x release is still supported (bug fixes and new release fixes). The 0.1.x branch will work on PHP 5.3 and PHP 5.4 but doesn't contain all the features that the 1.0.0 release has such as UDP support.

Getting started

Initialize a new client object:

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

This will create a new client object which you can use to read and write points to InfluxDB.

It's also possible to create a client from a DSN (Data Source Name):

// directly get the database object
$database = InfluxDB\Client::fromDSN(sprintf('influxdb://user:pass@%s:%s/%s', $host, $port, $dbname));

// get the client to retrieve other databases
$client = $database->getClient();

Reading

To fetch records from InfluxDB you can do a query directly on a database:

// fetch the database
$database = $client->selectDB('influx_test_db');

// executing a query will yield a resultset object
$result = $database->query('select * from test_metric LIMIT 5');

// get the points from the resultset yields an array
$points = $result->getPoints();

It's also possible to use the QueryBuilder object. This is a class that simplifies the process of building queries.

// retrieve points with the query builder
$result = $database->getQueryBuilder()
	->select('cpucount')
	->from('test_metric')
	->limit(2)
	->getResultSet()
	->getPoints();

// get the query from the QueryBuilder
$query = $database->getQueryBuilder()
	->select('cpucount')
	->from('test_metric')
	->where(["region = 'us-west'"])
	->getQuery();

Make sure that you enter single quotes when doing a where query on strings; otherwise InfluxDB will return an empty result.

You can get the last executed query from the client:

// use the getLastQuery() method
$lastQuery = $client->getLastQuery();

// or access the static variable directly:
$lastQuery = Client::lastQuery;

Writing data

Writing data is done by providing an array of points to the writePoints method on a database:

// create an array of points
$points = array(
	new Point(
		'test_metric', // name of the measurement
		0.64, // the measurement value
		['host' => 'server01', 'region' => 'us-west'], // optional tags
		['cpucount' => 10], // optional additional fields
		1435255849 // Time precision has to be set to seconds!
	),
    new Point(
    	'test_metric', // name of the measurement
		0.84, // the measurement value
		['host' => 'server01', 'region' => 'us-west'], // optional tags
		['cpucount' => 10], // optional additional fields
		1435255849 // Time precision has to be set to seconds!
	)
);

// we are writing unix timestamps, which have a second precision
$result = $database->writePoints($points, Database::PRECISION_SECONDS);

It's possible to add multiple fields when writing measurements to InfluxDB. The point class allows one to easily write data in batches to influxDB.

The name of a measurement and the value are mandatory. Additional fields, tags and a timestamp are optional. InfluxDB takes the current time as the default timestamp.

You can also write multiple fields to a measurement without specifying a value:

$points = [
	new Point(
		'instance', // the name of the measurement
		null, // measurement value
		['host' => 'server01', 'region' => 'us-west'], // measurement tags
		['cpucount' => 10, 'free' => 1], // measurement fields
		exec('date +%s%N') // timestamp in nanoseconds on Linux ONLY
	),
	new Point(
		'instance', // the name of the measurement
		null, // measurement value
		['host' => 'server01', 'region' => 'us-west'], // measurement tags
		['cpucount' => 10, 'free' => 2], // measurement fields
		exec('date +%s%N') // timestamp in nanoseconds on Linux ONLY
	)
];

Writing data using udp

First, set your InfluxDB host to support incoming UDP sockets:

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

Then, configure the UDP driver in the client:

// set the UDP driver in the client
$client->setDriver(new \InfluxDB\Driver\UDP($client->getHost(), 4444));

$points = [
	new Point(
		'test_metric',
		0.84,
		['host' => 'server01', 'region' => 'us-west'],
		['cpucount' => 10],
		exec('date +%s%N') // this will produce a nanosecond timestamp on Linux ONLY
	)
];

// now just write your points like you normally would
$result = $database->writePoints($points);

Or simply use a DSN (Data Source Name) to send metrics using UDP:

// get a database object using a DSN (Data Source Name)
$database = \InfluxDB\Client::fromDSN('udp+influxdb://username:pass@localhost:4444/test123');

// write your points
$result = $database->writePoints($points);

Note: It is import to note that precision will be ignored when you use UDP. You should always use nanosecond precision when writing data to InfluxDB using UDP.

Timestamp precision

It's important to provide the correct precision when adding a timestamp to a Point object. This is because if you specify a timestamp in seconds and the default (nanosecond) precision is set; the entered timestamp will be invalid.

// Points will require a nanosecond precision (this is default as per influxdb standard)
$newPoints = $database->writePoints($points);

// Points will require second precision
$newPoints = $database->writePoints($points, Database::PRECISION_SECONDS);

// Points will require microsecond precision
$newPoints = $database->writePoints($points, Database::PRECISION_MICROSECONDS);

Please note that exec('date + %s%N') does NOT work under MacOS; you can use PHP's microtime to get a timestamp with microsecond precision, like such:

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

Creating databases

When creating a database a default retention policy is added. This retention policy does not have a duration so the data will be flushed with the memory.

This library makes it easy to provide a retention policy when creating a database:

// create the client
$client = new \InfluxDB\Client($host, $port, '', '');

// select the database
$database = $client->selectDB('influx_test_db');

// create the database with a retention policy
$result = $database->create(new RetentionPolicy('test', '5d', 1, true));

// check if a database exists then create it if it doesn't
$database = $client->selectDB('test_db');

if (!$database->exists()) {
	$database->create(new RetentionPolicy('test', '1d', 2, true));
}

You can also alter retention policies:

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

and list them:

$result = $database->listRetentionPolicies();

You can add more retention policies to a database:

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

Client functions

Some functions are too general for a database. So these are available in the client:

// list users
$result = $client->listUsers();

// list databases
$result = $client->listDatabases();

Admin functionality

You can use the client's $client->admin functionality to administer InfluxDB via the API.

// add a new user without privileges
$client->admin->createUser('testuser123', 'testpassword');

// add a new user with ALL cluster-wide privileges
$client->admin->createUser('admin_user', 'password', \InfluxDB\Client\Admin::PRIVILEGE_ALL);

// drop user testuser123
$client->admin->dropUser('testuser123');

List all the users:

// show a list of all users
$results = $client->admin->showUsers();

// show users returns a ResultSet object
$users = $results->getPoints();

Granting and revoking privileges

Granting permissions can be done on both the database level and cluster-wide. To grant a user specific privileges on a database, provide a database object or a database name.

// grant permissions using a database object
$database = $client->selectDB('test_db');
$client->admin->grant(\InfluxDB\Client\Admin::PRIVILEGE_READ, 'testuser123', $database);

// give user testuser123 read privileges on database test_db
$client->admin->grant(\InfluxDB\Client\Admin::PRIVILEGE_READ, 'testuser123', 'test_db');

// revoke user testuser123's read privileges on database test_db
$client->admin->revoke(\InfluxDB\Client\Admin::PRIVILEGE_READ, 'testuser123', 'test_db');

// grant a user cluster-wide privileges
$client->admin->grant(\InfluxDB\Client\Admin::PRIVILEGE_READ, 'testuser123');

// Revoke an admin's cluster-wide privileges
$client->admin->revoke(\InfluxDB\Client\Admin::PRIVILEGE_ALL, 'admin_user');

Todo

  • More unit tests
  • Increase documentation (wiki?)
  • Add more features to the query builder
  • Add validation to RetentionPolicy

Changelog

###1.14.3

  • Deprecate IF NOT EXISTS clause in database creation

###1.14.2

  • Fix Notice when calling InfluxDB\Client::fromDSN without username or password
  • fixed Guzzle client timeout is float
  • Fix annotation
  • Remove unused property
  • Fixed misspelling
  • Fixed tag with Boolean/Null value trigger parse error

###1.4.1

  • Fixed bug: Escape field values as per line protocol.

###1.4.0

  • Updating Influx Database with support for writing direct payloads, thanks @virgofx

###1.3.1

  • Added ability to write data to a specific retention policy, thanks @virgofx !

###1.3.0

  • Added quoting of dbname in queries
  • Added orderBy to query builder
  • Fixed wrong orderby tests
  • Travis container-infra and php 7

###1.2.2

  • Fixed issue with listUsers() method
  • Added more unit tests
  • Added getColumns method to \InfluxDB\ResultSet

###1.2.0

  • Added support for 32 bit systems
  • Added setters/getters for Point fields

###1.1.3

  • Added support for symfony3

###1.1.2

  • Fixed issue with authentication when writing data

###1.1.1

  • Added support for 0.9.4
  • Added if not exists support to database->create()
  • Added getLastQuery method

###1.1.0

  • Added support for 0.9.3 rc2
  • Changed the way we handle the datatypes of values
  • Changed list retention policies to reflect the changes in 0.9.3

####1.0.1

  • Added support for authentication in the guzzle driver
  • Added admin functionality

####1.0.0

  • -BREAKING CHANGE- Dropped support for PHP 5.3 and PHP 5.4
  • Allowing for custom drivers
  • UDP support

####0.1.2

  • Added exists method to Database class
  • Added time precision to database class

####0.1.1

  • Merged repository to influxdb/influxdb-php
  • Added unit test for createRetentionPolicy
  • -BREAKING CHANGE- changed $client->db to $client->selectDB

simlux/influxdb-php 适用场景与选型建议

simlux/influxdb-php 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 59 次下载、GitHub Stars 达 0, 最近一次更新时间为 2017 年 12 月 31 日, 在 PHP 生态内属于活跃度较高的组件。

它主要适用于以下技术方向: 「client」 「influxdb」 「time series」 「influxdb client」 「influxdb class」 「influxdb library」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。

我们在过去多个企业项目中使用过 simlux/influxdb-php 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 simlux/influxdb-php 我们能提供哪些服务?
定制开发 / 二次开发

基于 simlux/influxdb-php 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 59
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 0
  • 点击次数: 0
  • 依赖项目数: 1
  • 推荐数: 0

GitHub 信息

  • Stars: 0
  • Watchers: 1
  • Forks: 126
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2017-12-31