Как в Yii2 логировать SQL-запросы с ActiveRecord?

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Чтобы следить за SQL-запросами в Yii2, следует активировать режим отладки, установив 'YII_DEBUG' в значение true. Также необходимо настроить логирование для категории 'db'. Приведу пример такой конфигурации:

php
Скопировать код
'components' => [
    'log' => [
        'targets' => [
            [
                'class' => 'yii\log\FileTarget',
                'levels' => ['trace'],
                'categories' => ['yii\db\*'],
                'logFile' => '@runtime/logs/sql.log',
            ],
        ],
    ],
],

С этими настройками ActiveRecord будет сохранять информацию о SQL-запросах в файл sql.log, включая параметры запросов.

Получение исходного SQL

Если вам необходимо увидеть исходный SQL-запрос для исправления ошибок или оптимизации производительности, его можно получить следующим образом:

php
Скопировать код
$query = User::find();  // Поиск пользователей
$sql = $query->createCommand()->getRawSql();  // Получение необработанного SQL
echo $sql;

Методы createCommand и getRawSql позволяют получить текст запроса, который будет выполнен в базе данных. Это может оказаться очень важно при отладке и оптимизации запросов.

Особенности работы с большим объёмом данных и сложными запросами

Будьте осторожны при работе с большими объемами данных и сложными запросами. Избегайте использования var_dump() или подобных функций, так как некорректное вычисление Count() может привести к загрузке всех результатов запроса и исчерпанию памяти. В таких случаях лучше ограничиться извлечением только текста SQL-запроса.

Отладка: для внутреннего использования

Модуль отладки должен быть активирован только во время разработки в локальном окружении. Игнорирование этого правила может привести к снижению производительности и угрозам безопасности. Более того, важно контролировать доступ к модулю отладки, правильно настроив параметр allowedIPs.

Визуализация

Представьте процесс логирования SQL-запросов в ActiveRecord Yii2 как поезд, движущийся по маршруту:

Markdown
Скопировать код
ActiveRecord = 🚂
SQL Query = 🚃
Logger = 🎥

Мы документируем каждый этап пути:

🎥 -> 🚂 -> 🚃

Как локомотив (ActiveRecord) тянет вагоны (SQL-запросы), так и камера (Logger) их фиксирует. Каждый поворот и остановка запроса документируется для последующего анализа.

Markdown
Скопировать код
Путь каждого SQL-запроса:
🚂(Генерация запроса) -> 🚃(Движение SQL-запроса) -> 🎥(Логирование Logger'ом)

Такое представление помогает лучше понять путь SQL-запроса внутри приложения.

Глубже взглянем на возможности логирования в Yii2

Запрос и исполнение: две стороны одной медали

В Yii2 можно логировать определённые виды SQL-операций. Для логирования операций чтения (SELECT) введите 'yii\db\Command::query', для операций изменения (INSERT, UPDATE, DELETE) — 'yii\db\Command::execute'. Такое разделение упрощает анализ логов:

php
Скопировать код
'components' => [
    'log' => [
        // ...
        'targets' => [
            // ...
            [
                'class' => 'yii\log\FileTarget',
                'levels' => ['info'],
                'categories' => ['yii\db\Command::query'],
                'logFile' => '@runtime/logs/query.log', // Для отслеживания только чтения данных
            ],
            [
                'class' => 'yii\log\FileTarget',
                'levels' => ['info'],
                'categories' => ['yii\db\Command::execute'],
                'logFile' => '@runtime/logs/execute.log', // Для отслеживания операций модификации данных
            ],
        ],
    ],
],

Форензическое логирование: шаг к оптимизации

Логирование позволяет не только распознавать ошибки, но и становится инструментом для оптимизации производительности. Периодический анализ SQL-логов поможет определить неэффективные запросы, которые можно оптимизировать или проиндексировать.

Раскрываем секреты ActiveRecord

Логирование помогает лучше понять, как ActiveRecord трансформирует ваши требования в SQL-запросы, что дает возможность писать более предсказуемые и производительные запросы.

Полезные материалы

  1. Handling Requests: Logging | The Definitive Guide to Yii 2.0 | Yii PHP Framework — познакомьтесь с системой логирования Yii2.
  2. Command, yii\db\Command | API Documentation for Yii 2.0 | Yii PHP Framework — изучите API Yii2 для работы с SQL.
  3. Understanding the view rendering flow | Wiki | Yii PHP Framework — углубитесь в особенности работы с SQL в Yii2.
  4. Working with Databases: Query Builder | The Definitive Guide to Yii 2.0 | Yii PHP Framework — получите знания о инструментах для построения запросов в Yii2.
  5. Key Concepts: Behaviors | The Definitive Guide to Yii 2.0 | Yii PHP Framework — узнайте больше о поведениях и настройке логирования в Yii2.
  6. Application Structure: Application Components | The Definitive Guide to Yii 2.0 | Yii PHP Framework — прочитайте о конфигурации компонентов приложения в Yii2.
  7. PSR-3: Logger Interface – PHP-FIG — погрузитесь в мир стандартов логирования PSR-3.