5facc95 Merge pull request #42 from tuupola/no-dev-master
b52d2cb Do not courage installing dev-master
0b88830 Merge branch 'release/1.3.0'
ce4a39b Changelog 1.3.0
22ff83e Merge pull request #38 from influxdata/feature/travis
0448a6d Fixed order contributors
1934531 Travis container-infra and php 7
42ba3a0 Merge pull request #37 from influxdata/feature/fix-testsuite
18f1c3a Fixed wrong orderby tests
9dc71c0 Merge pull request #35 from skazi0/order-by
f20ec57 Merge pull request #36 from skazi0/reserved-dbnames-fix
2232e47 Updated dependencies, added testscript
110ae56 added explicit testing of reserved keywords quoting
fa4b7e7 added test
a8cffeb - fixed tests - added more name quoting
223dc0f Update README.md
8375b67 added orderBy to query builder
07ce381 added quoting of dbname in queries
a2d6301 Fixed issue with listUsers, added getColumns and added unit tests
430d3e2 Fixed issue with intval function on 32bit php
ac12b98 Updated travis/codeclimate links after org rename to influxdata
5b2b53f Added support for 32 bit systems and added setters/getters for Point fields
5da903f Bumped version to 1.1.3; added support for symfony 3
9109fa2 Merge pull request #32 from sc0rp10/master
2fc58a6 change symfony/event-dispatcher version to 2.*|3.*
b1201e9 Merge pull request #27 from mermetbt/master
351c1a1 Leave booleans lowercase.
44b1fbc Merge pull request #26 from andig/fix-24
20bd2e7 Fix check timestamp format and add unit tests.
5ddab42 The Guzzle driver now throw an exception when the response has an invalid return code.
7c0f681 Fix multi-point encoding on windows
82b7540 Merge pull request #20 from iGusev/patch-2
2f83ba0 Improved test coverage
cb45f82 Modified readme for 1.1.2
99cf644 Merge pull request #23 from influxdb/ISSUE-21
b0ee796 ISSUE-21 - Fixed issue with authentication not working for write operations
a0d4215 Added groupBy method to QueryBuilder
b3cfd74 Added support for 0.9.4; added getlastQuery; added database if not exists support
22fda13 Merge pull request #19 from iGusev/patch-1
e96bb6d Code formatting
03b4cea Merge pull request #18 from cnelissen/escape-invalid-characters
6bb8e25 Merge pull request #17 from cnelissen/write-falsey-values
dddf3c7 Escape invalid characters
7e23035 Allow falsey value
29b13ed Changed version from 1.0.2 to 1.1.0
87e284c Updated changelog
df5d181 Added support for 0.9.3rc2
4f3f99c Merge pull request #16 from erwinw/patch-1
b1eb0b2 Update README.md
git-subtree-dir: lib/influxdb-php
git-subtree-split: 5facc95ef61ae66b365e878f69a9e8185693da89
influxdb-php
InfluxDB client library for PHP
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.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