Настройка 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.  
  3. require 'vendor/autoload.php';
  4.  
  5. $host = "http://192.168.0.15";
  6. $port = "8086";
  7. $bucket = "db_name";
  8.  
  9. $client = new InfluxDB2\Client([
  10.     "url" => "{$host}:{$port}",
  11.     "token" => "my-token",
  12.     "bucket" => "{$bucket}",
  13.     "org" => "my-org",
  14.     "precision" => InfluxDB2\Model\WritePrecision::NS
  15. ]);
  16.  
  17. $queryApi = $client->createQueryApi();
  18. $result = $queryApi->query(
  19.             'from(bucket:"'.$bucket.'")
  20.               |> range(start: -1h)
  21.               |> filter(fn: (r) => r._measurement == "table_name" )
  22.             ');
  23.  
  24. header('Content-type:application/json;charset=utf-8');
  25. echo json_encode( $result, JSON_PRETTY_PRINT ) ;
  26.  
  27. ?>

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

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

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

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

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

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

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

* в данном примере мы отсортируем наши результаты по полю field2 и ограничим число результатов до 3-х.

Возможные ошибки

В процессе настройки связки 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

# Linux # Серверы # DevOps
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет