influxdb/influxdb-php
PHP client library for InfluxDB 1.x: connect via host/port or DSN, write and query time-series points, and manage databases/retention policies. Community-maintained legacy v1 client; for InfluxDB 2.x use influxdb-client-php.
## Getting Started
### Minimal Setup
1. **Installation**
```bash
composer require influxdb/influxdb-php:^1.15.2
Ensure your composer.json includes the package under require with the new version constraint.
Basic Configuration
Create a config file (e.g., config/influxdb.php) with your InfluxDB connection details:
return [
'host' => env('INFLUXDB_HOST', 'localhost'),
'port' => env('INFLUXDB_PORT', 8086),
'database' => env('INFLUXDB_DATABASE', 'your_db'),
'username' => env('INFLUXDB_USERNAME', 'root'),
'password' => env('INFLUXDB_PASSWORD', 'root'),
'ssl' => env('INFLUXDB_SSL', false),
'timeout' => env('INFLUXDB_TIMEOUT', 30), // Added for clarity
];
First Use Case: Writing a Point (PHP 8 Compatible)
use InfluxDB\InfluxDB;
use InfluxDB\Point;
$client = new InfluxDB($config);
$point = Point::measurement('measurement')
->tag('tag1', 'value1')
->addField('field1', 42)
->addField('field2', 'value');
$client->writePoint($point);
Querying Data
$result = $client->query('SELECT * FROM "measurement"');
foreach ($result as $row) {
print_r($row);
}
Use InfluxDB to log application metrics with PHP 8 features:
$point = Point::measurement('app_logs')
->tag('user_id', $userId)
->addField('action', 'login')
->addField('status', 'success')
->timestamp(time(), 0);
$client->writePoint($point);
Track job execution with PHP 8 attributes (if using Laravel 9+):
#[HandleJobs]
public function handle()
{
$start = microtime(true);
try {
// Job logic
$duration = round(microtime(true) - $start, 2);
$point = Point::measurement('job_metrics')
->tag('job_name', self::class)
->addField('status', 'completed')
->addField('duration_ms', $duration * 1000);
$client->writePoint($point);
} catch (\Throwable $e) { // PHP 8+ exception type
$point = Point::measurement('job_metrics')
->tag('job_name', self::class)
->addField('status', 'failed')
->addField('error', $e->getMessage());
$client->writePoint($point);
throw $e;
}
}
$points = [];
for ($i = 0; $i < 100; $i++) {
$points[] = Point::measurement('batch_test')
->tag('batch_id', 1)
->addField('value', $i)
->timestamp(time() + $i, 0);
}
$client->writePoints($points, InfluxDB::PRECISION_MS); // Explicit precision
$client->createContinuousQuery(
name: 'cq_name',
query: 'SELECT mean(value) INTO "downsampled" FROM "batch_test" GROUP BY time(1h)'
);
use Illuminate\Support\Facades\Event;
Event::listen('user.registered', fn ($user) => {
$point = Point::measurement('user_events')
->tag('user_id', $user->id)
->addField('event', 'registered')
->addField('email', $user->email);
app('influxdb')->writePoint($point);
});
public function __construct(
protected \Illuminate\Contracts\Config\Repository $config
) {}
public function register()
{
$this->app->singleton('influxdb', fn () => new InfluxDB($this->config['influxdb']));
}
// .env
INFLUXDB_HOST=influx.example.com
INFLUXDB_PORT=8086
INFLuxDB_DATABASE=laravel_metrics
INFLUXDB_USERNAME=user
INFLUXDB_PASSWORD=pass
INFLUXDB_TIMEOUT=30
public function handle($request, Closure $next)
{
$start = microtime(true);
$response = $next($request);
$duration = round(microtime(true) - $start, 2);
$status = match ($response->getStatusCode()) {
200 => 'success',
default => 'error',
};
$point = Point::measurement('http_metrics')
->tag('route', $request->route()->getName())
->addField('method', $request->method())
->addField('status', $status)
->addField('duration_ms', $duration * 1000);
app('influxdb')->writePoint($point);
return $response;
}
#[Command(name: 'metrics:cleanup')]
public function cleanup()
{
$client = app('influxdb');
$client->query('DELETE FROM "batch_test" WHERE time < now() - 30d');
}
Deprecated Constructors: The Point class now primarily uses the fluent builder pattern.
// Old (deprecated)
$point = new Point('measurement', 'tag', ['field' => 'value']);
// New (recommended)
$point = Point::measurement('measurement')
->tag('tag', 'value')
->addField('field', 'value');
Exception Handling: Use \Throwable instead of \Exception for broader compatibility.
$client = new InfluxDB([
'host' => 'influx.example.com',
'ssl' => true,
'verify_peer' => true,
'ca_cert' => __DIR__ . '/certs/ca.pem',
'timeout' => 30,
]);
If using InfluxDB 2.x, leverage PHP 8 enums for precision:
$client->setPrecision(InfluxDB::PRECISION_MS); // Explicit precision
$client->setTimeout(30); // 30 seconds (use constants if available in future)
string type hints).$client = new InfluxDB($config);
$client->setLogLevel(\InfluxDB\Logger::LOG_LEVEL_DEBUG);
try {
$client->query('SHOW MEASUREMENTS');
} catch (\Throwable $e) {
error_log('InfluxDB Error: ' . $e->getMessage());
}
$config = $this->config['influxdb'] ?? [];
$client = new InfluxDB($config);
if ($client->ping()) {
info('InfluxDB connection successful');
} else {
error_log('InfluxDB connection failed');
}
$point = Point::measurement('test')
->tag('tag', 'value')
->addField('field', 'value
How can I help you explore Laravel packages today?