BMC IO DocsBMC IO Docs
IO v6
IO v7
Notes
Docs
IO v6
IO v7
Notes
Docs
  • IO Framework v7

    • О фреймворке
    • Что изменилось в 7 версии
    • IO7 Framework vs Laravel 13 — Сравнение
    • Структура
    • Варианты проектов
    • Доступ к участкам проекта
    • Разворачивание нового проекта
    • Установка проекта
    • Запуск локальной разработки
  • API

    • Обзор API
    • IOCore::call() и IOCore::callAction()
    • Создание API
  • CLI

    • Обзор CLI
    • iocli
    • Кастомные CLI команды
  • Работа с базами данных

    • Обзор работы с базами данных
    • Cron / Планировщик задач (Schedule)
    • Фабрики
    • Миграции
    • Сидеры
    • Query Builder
    • Подключение MinIO
    • Подключение MongoDB
    • Подключение MySQL
    • Подключение PostgreSQL
    • Подключение ProxySQL
    • Подключение RabbitMQ
    • Подключение Redis
  • Логирование

    • Обзор логирования
    • IOEvent - Логирование событий
    • Pinba (PinbaManager) - Профилировщик
  • Модели

    • Обзор моделей
    • CRUD операции
    • Связи моделей
  • Очереди

    • Обзор очередей
    • RabbitMQ
  • Маршруты

    • Обзор маршрутов
    • Определение маршрутов
    • Middleware
  • Сессии

    • Обзор сессий
    • Кроссдоменная SSO
    • JWT авторизация
    • Социальная авторизация
    • OAuth2
    • Keycloak
  • Twig

    • Обзор Twig
    • Формы (FormBuilder)
    • Twig функции
  • Тестирование

    • Обзор тестирования
    • Unit тесты
  • Backend

    • Настройки проекта Conf.php
    • Настройки модуля Module.php
    • Настройки composer
    • Функции фреймворка
    • Вспомогательные функции (Helpers)
    • Глобальные переменные
    • Константы фреймворка
    • Event класс
    • Core класс
    • Route и работа с ними
    • Request и работа с ними
    • Middleware и работа с ними
    • Class и работа с ними
    • Api model и работа с ними
    • Template и работа с ними
    • Мультиязычность и словарь фраз
    • Bin скрипты и работа с ними
    • Cron скрипты и работа с ними
    • $ioSession и работа с сессией
    • $ioHash и работа с кешем
    • $ioXCache и работа с кешем
    • $iodb и работа с базой данных
    • Миграции
  • Frontend

    • Twig шаблонизатор и работа с ним
    • Twig функции
    • Twig фильтры
    • Twig контекст
    • Настройка NPM
    • Сборка Frontend составляющей
    • Обращение к Api через JS
    • Хранилище (store)
    • Навигация в хосте
    • Навигация в микрофронтенде
    • Параметры микрофронтенда
    • Проверка полномочий
  • Tailux UI Компоненты

    • Базовый UI

      • AvatarDot
      • Avatar
      • Badge
      • Button
      • Card
      • ConfirmModal
      • Divider
      • Highlight
      • Tag
    • Загрузка

      • Circlebar
      • Progress
      • Skeleton
      • Spinner
    • Навигация

      • Accordion
      • AccordionButton
      • AccordionHeader
      • AccordionItem
      • AccordionPanel
      • AccordionProvider
      • Pagination
      • PaginationControl
      • PaginationItems
      • PaginationDots
      • PaginationFirst
      • PaginationLast
      • PaginationNext
      • PaginationPrevious
    • Отображение данных

      • Box
      • Collapse
      • ContextualHelp
      • ScrollShadow
      • Timeline
      • TimelineItem
    • Элементы таблиц

      • Table
      • CollapsibleSearch
      • ColumnFilter
      • CopyableCell
      • DateFilter
      • FacetedFilter
      • FilterSelector
      • PaginationSection
      • RadioFilter
      • RangeFilter
      • ResponsiveFilter
      • RoleFilter
      • SelectedRowsActions
      • TableColumnVisibility
      • TableSettings
      • TableSortIcon
    • Элементы форм

      • Checkbox
      • Combobox
      • DatePicker
      • Filepond
      • Input
      • Listbox
      • Radio
      • Range
      • Select
      • StyledSwitch
      • Swap
      • SwapOn
      • SwapOff
      • Switch
      • Textarea
      • TextEditor
      • Upload

Pinba (PinbaManager) — Профилировщик

Внимание

Данная статья документации написана нейросетью. Возможны некоторые расхождения и неточность информации!

  • Обзор
    • Требования
    • Как это работает
  • Конфигурация
    • Через .env (рекомендуется)
    • Через define()
    • Через init() вручную
    • Параметры init()
  • Методы
    • init(array $config = []): static
    • start(string $name, array $tags = []): int|false
    • stop(int|false $timerId): void
    • addTimer(string $name, float $value, array $tags = []): void
    • addMetric(string $name, float $value, array $tags = []): void
    • setTag(string $key, string $value): void
    • setRequestTime(float $time): void
    • flush(): void
    • reset(): void
    • getInfo(): array
    • isAvailable(): bool
  • Примеры
    • Замер времени запроса
    • Замер нескольких операций
    • Ручное добавление таймеров
    • Мониторинг памяти
    • В cron задачах
  • Использование без PinbaManager

Обзор

IO\Profile\PinbaManager — обёртка над gggeek/polyfill-pinba для профилирования PHP-приложений. Отправляет таймеры и метрики в Pinba-сервер через UDP для анализа производительности.

Требования

  • composer require gggeek/polyfill-pinba
  • Pinba-сервер (Pinba v1 или Pinba2)
  • Включить в php.ini:
    pinba.enabled=1
    pinba.server=127.0.0.1:3002
    

Или через PinbaManager::init():

\IO\Profile\PinbaManager::init([
    'enabled' => true,
    'server' => '127.0.0.1:3002',
]);

Как это работает

gggeek/polyfill-pinba — чистая PHP-реализация API расширения pinba. Не требует компиляции C-расширения. Автоматически отправляет собранные данные в Pinba-сервер по UDP в конце выполнения скрипта (auto-flush).

Конфигурация

Через .env (рекомендуется)

Фреймворк автоматически инициализирует PinbaManager при старте, если переменные заданы в .env:

PINBA_ENABLE=1
PINBA_SERVER=127.0.0.1:3002
PINBA_HOSTNAME=web01
PINBA_SCRIPT_NAME=/api/users
ПеременнаяОписаниеПример
PINBA_ENABLEВключить профилирование (1 = вкл)1
PINBA_SERVERАдрес сервера host:port (приоритетнее PINBA_HOST/PINBA_PORT)127.0.0.1:3002
PINBA_HOSTХост Pinba-сервера127.0.0.1
PINBA_PORTПорт Pinba-сервера3002
PINBA_HOSTNAMEИмя хоста для отображения в Pinbaweb01
PINBA_SCRIPT_NAMEИмя скрипта/api/users

Доступ через $app->pinba:

$timerId = $app->pinba->start('api_request', ['endpoint' => '/api/users']);
// ... обработка
$app->pinba->stop($timerId);

Через define()

define('PINBA_ENABLE', 1);
define('PINBA_SERVER', '127.0.0.1:3002');
define('PINBA_HOSTNAME', 'web01');

Через init() вручную

\IO\Profile\PinbaManager::init([
    'enabled' => true,
    'server' => '127.0.0.1:3002',
    'hostname' => 'web01',
    'server_name' => 'example.com',
    'script_name' => '/api/users',
]);

Параметры init()

ПараметрТипОписание
enabledboolВключить профилирование
serverstringАдрес Pinba-сервера (host:port) — приоритетнее host/port
hoststringХост (используется если server не задан)
portintПорт (используется если server не задан)
hostnamestringИмя хоста для отображения в Pinba
server_namestringИмя сервера (например, example.com)
script_namestringИмя скрипта
start_timefloatВремя начала (microtime) для точного замера

Методы

init(array $config = []): static

Инициализация менеджера и настройка polyfill-pinba.

\IO\Profile\PinbaManager::init([
    'enabled' => true,
    'server' => '127.0.0.1:3002',
]);

start(string $name, array $tags = []): int|false

Начать замер времени. Возвращает ID таймера для передачи в stop().

ПараметрТипОписание
$namestringИмя операции (становится тегом group)
$tagsarrayДополнительные теги
Возвратint|falseID таймера или false если disabled
$timerId = \IO\Profile\PinbaManager::start('db_query', ['table' => 'users', 'operation' => 'select']);
// ... выполнение запроса
\IO\Profile\PinbaManager::stop($timerId);

stop(int|false $timerId): void

Остановить таймер и зафиксировать время.

\IO\Profile\PinbaManager::stop($timerId);

addTimer(string $name, float $value, array $tags = []): void

Добавить завершённый таймер с известным временем.

\IO\Profile\PinbaManager::addTimer('db_query', 0.05, ['query' => 'SELECT * FROM users']);

addMetric(string $name, float $value, array $tags = []): void

Добавить метрику (по сути то же, что addTimer).

\IO\Profile\PinbaManager::addMetric('memory_usage', memory_get_usage() / 1024 / 1024);
\IO\Profile\PinbaManager::addMetric('users_count', count($users));

setTag(string $key, string $value): void

Установить тег уровня запроса.

\IO\Profile\PinbaManager::setTag('application', 'io7proj');
\IO\Profile\PinbaManager::setTag('environment', 'production');

setRequestTime(float $time): void

Установить время выполнения запроса вручную.

\IO\Profile\PinbaManager::setRequestTime(microtime(true) - $startTime);

flush(): void

Принудительная отправка данных в Pinba-сервер.

\IO\Profile\PinbaManager::flush();

reset(): void

Сбросить все таймеры и данные.

\IO\Profile\PinbaManager::reset();

getInfo(): array

Получить информацию о текущем запросе.

$info = \IO\Profile\PinbaManager::getInfo();

isAvailable(): bool

Проверка доступности Pinba.

if (\IO\Profile\PinbaManager::isAvailable()) {
    // Pinba включён
}

Примеры

Замер времени запроса

\IO\Profile\PinbaManager::init([
    'enabled' => true,
    'server' => '127.0.0.1:3002',
]);

$timerId = \IO\Profile\PinbaManager::start('api_request', [
    'endpoint' => '/api/users',
    'method' => 'GET',
]);

// ... обработка запроса
$users = $db->search('users', []);

\IO\Profile\PinbaManager::stop($timerId);
// Данные автоматически отправятся в конце скрипта

Замер нескольких операций

$t1 = \IO\Profile\PinbaManager::start('page_render');
$t2 = \IO\Profile\PinbaManager::start('db_query', ['table' => 'users']);

$users = $db->search('users', []);

\IO\Profile\PinbaManager::stop($t2);
\IO\Profile\PinbaManager::addMetric('users_count', count($users));

// ... рендер шаблона

\IO\Profile\PinbaManager::stop($t1);

Ручное добавление таймеров

$start = microtime(true);
// ... сложная операция
$duration = microtime(true) - $start;

\IO\Profile\PinbaManager::addTimer('complex_operation', $duration, [
    'type' => 'data_processing',
]);

Мониторинг памяти

\IO\Profile\PinbaManager::addMetric('memory_usage', memory_get_usage() / 1024 / 1024);
\IO\Profile\PinbaManager::addMetric('peak_memory', memory_get_peak_usage() / 1024 / 1024);

В cron задачах

class CleanUpCron extends \IO\CronTemplate
{
    public function cron_do(): void
    {
        $timerId = \IO\Profile\PinbaManager::start('cleanup_job');

        // ... очистка данных

        \IO\Profile\PinbaManager::stop($timerId);
        \IO\Profile\PinbaManager::addMetric('cleaned_items', $count);
    }
}

Использование без PinbaManager

Можно использовать polyfill-pinba напрямую:

use PinbaPhp\Polyfill\PinbaFunctions as pinba;

pinba::init(microtime(true));

$timer = pinba_timer_start(['group' => 'db', 'operation' => 'select']);
// ... запрос
pinba_timer_stop($timer);

pinba_timer_add(['group' => 'cache', 'operation' => 'get'], 0.001);

pinba_flush();
Prev
IOEvent - Логирование событий