Улучшенный дебаг с помощью Whoops
Whoops — это такая классная библиотека, которая в красивом виде показывает, когда возникла какая-нибудь ошибка.
Плюсы много в чём, сразу в удобном и красивом виде видно контекст строки, где произошла ошибка, точно так же можно прогуляться по стеку (слева), и справа каждый раз будет показан верный контекст. Очень удобно!
Снизу всякие переменные текущие показаны, в общем классная штука. Кстати как плюс, я теперь смог отключить xdebug, что очень сильно ускорило мой локальный PHP. Не факт, что здесь я поступил правильно, но моё дело поделиться с вами идеей.
Установить whoops просто:
composer require filp/whoops
, или прочитайте альтернативные варианты на их сайте или их гитхабе.
Проблема в том, что если его установить и активировать
1 2 3 |
$whoops = new \Whoops\Run(); $whoops->pushHandler(new \Whoops\Handler\PrettyPageHandler); $whoops->register(); |
, то логи ошибок перестанут писаться в другие места, в стандартный лог пхп. А это недопустимо.
Давайте починим, чтобы логи не только красиво показывались, но и писались во все места.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
init_whoops(); function init_whoops() { global $whoops; $whoops = new \Whoops\Run(); $whoops_pretty_page_handler = new \Whoops\Handler\PrettyPageHandler(); $whoops_pretty_page_handler->setEditor('sublime'); $whoops->pushHandler($whoops_pretty_page_handler); $monolog_multiline_formatter = new \Monolog\Formatter\LineFormatter(null, null, true); $monolog_error_log_handler = new \Monolog\Handler\ErrorLogHandler(); $monolog_error_log_handler->setFormatter($monolog_multiline_formatter); $monolog_logger_error_log = new \Monolog\Logger('whoops_logger', [$monolog_error_log_handler]); $whoops_plain_text_handler = new \Whoops\Handler\PlainTextHandler(); $whoops_plain_text_handler->loggerOnly(true); $whoops_plain_text_handler->setLogger($monolog_logger_error_log); $whoops->pushHandler($whoops_plain_text_handler); $monolog_browser_console_handler = new \Monolog\Handler\BrowserConsoleHandler(); $monolog_browser_console_handler->setFormatter($monolog_multiline_formatter); $monolog_browser_console_logger = new \Monolog\Logger('whoops_browser_console_logger', [$monolog_browser_console_handler]); $whoops_plain_text_handler2 = new \Whoops\Handler\PlainTextHandler(); $whoops_plain_text_handler2->loggerOnly(true); $whoops_plain_text_handler2->setLogger($monolog_browser_console_logger); $whoops->pushHandler($whoops_plain_text_handler2); $whoops->register(); } |
Здесь у нас логи будут показываться красиво, писаться в пхп еррор лог, и даже выводиться в браузере в консоли.
Ура!
Альтернативы
На самом деле, есть такая альтернатива: https://github.com/Rarst/wps
Плагин не только сам включит поддержку whoops для фронтенда, но и для json и ajax. Я попробовал, но пришёл к выводу, что мне это не подходит. Например, ошибки в формате json мне мешают. Стандартный PrettyPageHandler делает красивый plain text комментарий в начале своей страницы, его удобно читать в аутпуте json:
Да и дорабатывать его нельзя, ошибки в лог точно так же не пишутся.
И отчёты об ajax ошибках в Query Monitor он точно так же ломает.
Минусы Whoops
Я пока знаю только один минус. По умолчанию, Query Monitor
покажет ajax ошибку в своём интерфейсе, а с включенным whoops не покажет. Но ничего страшного, эта ошибка надёжно сохранена в еррор логе пхп.
Не минус но недочёт: я пока так и не смог принимать ссылки subl://
, чтобы по ссылке в сообщении об ошибке я сразу мог открыть саблайм на нужном месте. Сейчас нужно выделить
, Ctrl+C
, Alt+Tab
, Ctrl+P
, Ctrl+V
, :номер_строки
, Enter
. Тоже очень-очень быстро, но не быстрее, чем 1 клик.
Рекомендую Whoops! Ошибки в пхп для крутых пацанов ;)
Обсуждение