Настройка PHP + InfluxDB

Используемые термины: InfluxDB , PHP , SQL .

В данной инструкции рассмотрим процесс настройки сервера с установленным PHP для работы с InfluxDB. Также разберем пример кода для подключения к СУБД и выполнения простых запросов. В качестве операционной системы будем использовать Linux.

Предполагается, что у нас уже установлен сервер с InfluxDB и PHP, иначе, можно воспользоваться инструкциями Установка telegraf и передача метрик в InfluxDB (раздел Установка и настройка InfluxDB ), а также настройка полноценного веб-сервера на Ubuntu , CentOS 7 и CentOS 8 .

Системные требования

В нашем примере мы будем рассматривать подключение к СУБД на основе библиотек 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. Простая выборка данных за последний час:

  1. <?php
  2. require ‘vendor/autoload.php’;
  3. $host = «http://192.168.0.15»;
  4. $port = «8086»;
  5. $bucket = «db_name»;
  6. $client = new InfluxDB2Client([
  7. «url» => «{$host}:{$port}»,
  8. «token» => «my-token»,
  9. «bucket» => «{$bucket}»,
  10. «org» => «my-org»,
  11. «precision» => InfluxDB2ModelWritePrecision::NS
  12. ]);
  13. $queryApi = $client->createQueryApi();
  14. $result = $queryApi->query(
  15. ‘from(bucket:»‘.$bucket.'»)
  16. |> range(start: -1h)
  17. |> filter(fn: (r) => r._measurement == «table_name» )
  18. ‘);
  19. header(‘Content-type:application/json;charset=utf-8’);
  20. echo json_encode( $result, JSON_PRETTY_PRINT ) ;
  21. ?>

* обратите внимание, что данный запрос к базе отличается от стандартного SQL. Это так называемый, Flux query.
* где:

  • 192.168.0.15 — адрес сервера InfluxDB, к которому идет подключение.
  • db_name — имя базы данных.
  • table_name — таблица или в, терминалогии InfluxDB, measurement.

2. Выборка данных по двум полям:

  1. $result = $queryApi->query(
  2. ‘from(bucket:»‘.$bucket.'»)
  3. |> range(start: -1h)
  4. |> filter(fn: (r) =>
  5. r._measurement == «table_name» and
  6. (r._field == «field1» or r._field == «field2»)
  7. )
  8. ‘);

* в данном примере мы сделаем вывод данных только для полей field1 и field2 .

3. Сортировка и лимит:

  1. $result = $queryApi->query(
  2. ‘from(bucket:»‘.$bucket.'»)
  3. |> range(start: -1h)
  4. |> filter(fn: (r) =>
  5. r._measurement == «table_name» and
  6. (r._field == «field1» or r._field == «field2»)
  7. )
  8. |> sort(columns: [«field2», «_value»], desc: false)
  9. |> limit(n: 3)
  10. ‘);

* в данном примере мы отсортируем наши результаты по полю 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

EnglishRussianUkrainian