Отладка и логирование

Урок 7 из 9

50 мин

Немного теории

Отладка PHP

В мире веб-разработки существует несколько устоявшихся практик отладки приложений. Разработчики платформы «1С-Битрикс: Управление сайтом» учли это и вам не придется самим печатать var_dump в файл через fwrite.

Самый простой способ отладки кода — отображение данных прямо в браузере на экране пользователя. Способ широко применяется на изолированной среде для разработчика и никогда — на боевой версии сайта.

Помимо стандартных функций PHP print_r, var_dump, var_export в API платформы доступны функция mydump и метод Debug::dump.

Трейс

В обработчиках событий или API-вызовах бывает важно, в целях отладки, узнать, как интерпретатор PHP пришел к выполнению текущей строки. Для этой цели подойдут стандартная функция PHP debug_backtrace и метод платформы \Bitrix\Main\Diag\Helper::getBackTrace. Метод возвращает массив, описывающий все предыдущие вызовы методов и функций, предшествовавшие текущей позиции в коде.

Данные из трейса читаются с конца массива к его началу (при распечатке на экране — снизу вверх). У каждого шага трейса указывается путь к файлу file, номер строки line и функция function, которая была там вызвана.

Лог-файлы

Для случаев, когда отладить нужно код, исполняемый для другого пользователя, а также при работе на боевой версии сайта, используют печать отладочной информации в лог-файлы. Системные методы для этой операции: Debug::writeToFile (печать в файл функцией print_r), Debug::dumpToFile (печать в файл функцией var_dump) и AddMessage2Log.

Методам класса Debug можно сообщить, в какой файл вести печать, а если пропустить этот аргумент, печать будет произведена в файл __bx_log.log в корне сайта. Поэтому всегда проверяйте, чтобы файлы __bx_log.log были закрыты от просмотра средствами браузера.

Функция AddMessage2Log не принимает путь к файлу, он задается константой LOG_FILENAME в файле конфигурации dbconn.php. Если константа не будет объявлена, отладочная печать будет отменена.

Созданные файлы хранят важную техническую информацию о работе сервера и сайта, и должны быть защищены от просмотра средствами браузера, чтобы не выдать информацию злоумышленнику, который случайным образом попробует получить доступ через протокол HTTP ко всем распространенным вариантам наименований лог-файлов. Для сервера Apache ограничение доступа нужно установить с помощью файла .htaccess в корне сайта.

Тогда доступ к лог-файлам будет либо через административный раздел сайта и функции работы с файловой системой, либо через панель управления хостингом, либо по SSH/SFTP.

Также нужно помнить, что отладочную информацию иногда может выводить и сама платформа. Для предотвращения этого всегда выключайте режим отладки в .settings.php по ключу “exception_handling > debug”.

Для удобства разработчика рекомендуем всегда добавлять в лог-файл следующие данные:

  • __FILE__ — путь к файлу, откуда происходит логирование
  • __LINE__ — номер строки в файле, откуда происходит логирование
  • Текущие дата и время

Тогда, даже после длительного перерыва в работе над сайтом, у вас не возникнет трудностей, когда нужно будет найти, какой именно скрипт на сервере ведет постоянную запись в растущий лог-файл.

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

  • microtime — функция PHP, возвращает системное время с миллисекундами
  • hrtime — функция PHP, возвращает системное время повышенной точности
  • Helper::getCurrentMicrotime — возвращает текущую метку времени Unix с микросекундами
  • Debug::startTimeLabel — определяет начало именованного периода отладки
  • Debug::endTimeLabel — определяет конец именованного периода отладки
  • Debug::getTimeLabels — возвращает перечень всех периодов отладки с указанием продолжительности

Последние 3 метода используются совместно. Сначала разработчик должен окружить интересующие его блоки кода метками начала и конца периода отладки, а потом один раз вывести перечень меток в лог-файл.

Для контроля за памятью PHP можно использовать функцию memory_get_usage. Функция возвращает текущее количество выделенной для PHP-скрипта памяти. Возьмите за правило при проблемах с выделением памяти делать замеры с помощью memory_get_usage незадолго до места предполагаемой ошибки.

Обработка исключений

По ключу “exception_handling > log” в файле .settings.php можно задать механизм обработки исключительных ситуаций. В простом случае это массив с настройками file (путь к файлу лога исключений) и log_size (размер файла лога для ротации).

Если в корне сайта лежит файл error.php и отключен вывод ошибок на экран, то этот файл будет подключен в случае возникновения необработанного исключения.

Можно изменить файловый лог на произвольный, если задать в ключе class_name название класса-наследника ExceptionHandlerLog.

Журналирование ошибок

Лог-файлы — самый простой способ накопления отладочной информации для ее дальнейшего использования. В платформе «1С-Битрикс: Управление сайтом» в БД существует Журнал событий для регистрации всех нештатных или важных ситуаций. Если речь не идет о частой записи больших объемов данных, то можно воспользоваться методом CEventLog::Add или CEventLog::Log (обертка над CEventLog::Add).

По сравнению с лог-файлами Журнал событий дает возможность сортировки и фильтрации данных, а также самостоятельно собирает дополнительные данные:

  • ID пользователя
  • User agent-информацию о браузере
  • IP-адрес пользователя
  • URL страницы

Прямо в интерфейсе Журнала событий можно настроить правила оповещения по E-mail и СМС для администратора сайта, чтобы сразу узнавать о проблемах на сайте.

Отладка с помощью Xdebug

В сложных случаях, когда возможностей логирования недостаточно и хочется отлаживать работу PHP-скрипта построчно, в решении проблемы поможет дополнительное расширение Xdebug.

Xdebug нельзя устанавливать на боевом сервере, т.к. он вмешивается в работу PHP и замедляет его. Используйте его только на копии сайта для разработчика.

Выполнив настройку, можно подключить свою IDE и использовать привычные для десктопной разработки пошаговые действия отладчика.

Отладка SQL

Особый вид отладочных ситуаций — работа с SQL-запросами к БД. Даже если не использовать собственные запросы, а ограничиться готовыми методами ORM, иногда запросы выдают, на первый взгляд, некорректную информацию. Чтобы узнать, какой запрос сформировал API платформы, используйте пару методов \Bitrix\Main\DB\Connection::startTracker и \Bitrix\Main\DB\Connection::stopTracker.

Метод startTracker запустит сбор SQL-запросов. По его окончании, после вызова stopTracker вы сможете получить текст выполненных запросов методом \Bitrix\Main\Diag\SqlTracker::getQueries. Например, для сохранения его в лог-файл или Журнал событий.

При включении трекера, каждый запрос, осуществленный методом \Bitrix\Main\DB\Connection::queryInternal() (ядро D7) будет записываться, также будут записаны время начала и окончания запроса. Поэтому не все запросы осуществленные через старое ядро можно будет отследить таким образом.

Схожие возможности дает Монитор производительности. Запустить монитор можно вручную в административном разделе в двух режимах — полный сбор всех SQL-запросов в течение часа или сбор только медленных запросов в течение недели. Все собранные запросы сохраняются в БД модуля и будут доступны к просмотру администратором сайта на странице “Настройки > Производительность > Запросы SQL”.

Если объявить в dbconn.php переменную $DBDebugToFile как true, все SQL запросы к базе данных и время их выполнения будут записываться в лог-файл /mysql_debug.sql. Ведение такого лога может серьезно замедлить работу сайта, поэтому пользоваться этим стоит кратковременно.

Отладка javascript

Современные браузеры предоставляют полноценные инструменты отладки javascript-кода (пошаговое выполнение, профилирование, отладка XHR-запросов).

Для централизованного вывода отладочной информации в консоль браузера используется метод BX.debug. Отключение и включение режима отладки производится методами BX.disableDebug и BX.enableDebug.

Практика

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

Отладка и логирование

39 мин

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