Настройка PHP + InfluxDB
Используемые термины: InfluxDB, PHP, SQL.
В данной инструкции рассмотрим процесс настройки сервера с установленным PHP для работы с InfluxDB. Также разберем пример кода для подключения к СУБД и выполнения простых запросов. В качестве операционной системы будем использовать Linux.
Предполагается, что у нас уже установлен сервер с InfluxDB и PHP, иначе, можно воспользоваться инструкциями Установка telegraf и передача метрик в InfluxDB (раздел Установка и настройка InfluxDB), а также настройка полноценного веб-сервера на Ubuntu, CentOS 7 и CentOS 8.
Требования к системе
Установка и настройка необходимых компонентов
Подключение к СУБД из PHP и примеры запросов
Возможные ошибки
Системные требования
В нашем примере мы будем рассматривать подключение к СУБД на основе библиотек influxdb-client-php и influxdb-php. Первая более современная и рассчитана на более новые версии InfluxDB и PHP. Рассмотрим подробнее требования к данным библиотекам.
influxdb-php:
- PHP >= 5.3. Поддерживаются и более ранние версии, но доступны не все функции.
- InfluxDB <= 1.7
influxdb-client-php:
- PHP >= 7.1.
- InfluxDB >= 1.8
И так, необходимо выбрать соответствующую версию библиотеки для наших версий PHP и InfluxDB. В данной инструкции мы будем работать с influxdb-client-php, PHP 7.4 и InfluxDB 1.8.
Установка необходимых компонентов и настройка сервера
Устанавливаем композер.
а) Для DEB-систем (Ubuntu, Debian):
apt-get install composer
б) Для RPM (CentOS, Red Hat):
yum install composer
Переходим в каталог с нашим проектом, например:
cd /var/www/site/test/influx
Запускаем установку библиотеки:
composer require influxdata/influxdb-client-php
В каталоге с проектом должна появиться папка vendor. Мы готовы переходить к коду.
Пример кода для работы с InfluxDB в PHP
Рассмотрим несколько примеров работы с InfluxDB.
Подключение библиотеки выполняется относительно каталога vendor, который появился после запуска композера. Предполагается, что скрипт находится в той же папке, что и каталог vendor — в таком случае подключение библиотеки выполняется кодом require 'vendor/autoload.php'. Если же наш скрипт находится в другом каталоге, необходимо прописать правильный путь до файла autoload.php.
1. Простая выборка данных за последний час:
- <?php
- require 'vendor/autoload.php';
- $host = "http://192.168.0.15";
- $port = "8086";
- $bucket = "db_name";
- $client = new InfluxDB2\Client([
- "url" => "{$host}:{$port}",
- "token" => "my-token",
- "bucket" => "{$bucket}",
- "org" => "my-org",
- "precision" => InfluxDB2\Model\WritePrecision::NS
- ]);
- $queryApi = $client->createQueryApi();
- $result = $queryApi->query(
- 'from(bucket:"'.$bucket.'")
- |> range(start: -1h)
- |> filter(fn: (r) => r._measurement == "table_name" )
- ');
- header('Content-type:application/json;charset=utf-8');
- echo json_encode( $result, JSON_PRETTY_PRINT ) ;
- ?>
* обратите внимание, что данный запрос к базе отличается от стандартного SQL. Это так называемый, Flux query.
* где:
- 192.168.0.15 — адрес сервера InfluxDB, к которому идет подключение.
- db_name — имя базы данных.
- table_name — таблица или в, терминалогии InfluxDB, measurement.
2. Выборка данных по двум полям:
- ...
- $result = $queryApi->query(
- 'from(bucket:"'.$bucket.'")
- |> range(start: -1h)
- |> filter(fn: (r) =>
- r._measurement == "table_name" and
- (r._field == "field1" or r._field == "field2")
- )
- ');
- ...
* в данном примере мы сделаем вывод данных только для полей field1 и field2.
3. Сортировка и лимит:
- ...
- $result = $queryApi->query(
- 'from(bucket:"'.$bucket.'")
- |> range(start: -1h)
- |> filter(fn: (r) =>
- r._measurement == "table_name" and
- (r._field == "field1" or r._field == "field2")
- )
- |> sort(columns: ["field2", "_value"], desc: false)
- |> limit(n: 3)
- ');
- ...
* в данном примере мы отсортируем наши результаты по полю field2 и ограничим число результатов до 3-х. Сортировка будет прямой (desc: false), для обратной нужно использовать desc: true.
Возможные ошибки
В процессе настройки связки PHP + InfluxDB, мы можем столкнуться с проблемами. Попробую описать то, с чем столкнулся я.
1. Error: Flux query service disabled. Verify flux-enabled=true in the [http] section of the InfluxDB config. : 403 Forbidden
Ошибка возникает при попытке сделать запрос из PHP.
Причина: запрещено выполнение запросов типа Flux. Данная опция, по умолчанию, может быть выставлена в положение disabled.
Решение: на сервере InfluxDB открываем конфигурационный файл:
vi /etc/influxdb/influxdb.conf
Редактируем параметр:
flux-enabled = true
Перезапускаем сервис influxdb:
systemctl restart influxdb