Как правильно лоигровать ошибки php?
Добрый день, подскажите по такому вопросу. Не могу понять как правильно лигироать все ошибки php
Создал такой класс
<?php namespace App; class ErrorHandler { public function __construct() { error_reporting(E_ALL); set_error_handler([$this, 'errorHandler'], E_ALL); register_shutdown_function([$this, 'fatalErrorHandler']); } public function errorHandler($errno, $errtext, $file, $line) { $message = 'Ошибка ' . $errtext . ' файл ' . $file . ' строка - ' . $line; echo $message; } public function fatalErrorHandler() { $error = error_get_last(); print_r($error); } } |
<?php namespace App; class ErrorHandler { public function __construct() { error_reporting(E_ALL); set_error_handler([$this, 'errorHandler'], E_ALL); register_shutdown_function([$this, 'fatalErrorHandler']); } public function errorHandler($errno, $errtext, $file, $line) { $message = 'Ошибка ' . $errtext . ' файл ' . $file . ' строка - ' . $line; echo $message; } public function fatalErrorHandler() { $error = error_get_last(); print_r($error); } }
Ошибки например неопределеных переменных или отсутвующих функций он отлавливает, а вот например ошибки синтаксиса типа
Parse error: syntax error, unexpected end of file, expecting ';' or ',' in почему то нет
Не подскажите как правильно логировать и подобные ошибки?
Дополнительно:
Ответы:
Не получится, синтаксические ошибки не отловить, так как они появляются до запуска скрипта на выполнение.
Но если перед запуском приложения выполнить php с ключом -l (--syntax-check) то приложение не будет запущено а только пройдет проверка на ошибки и при наличии она будет выведена, ее можно прочитать
exec('php --syntax-check main.php',$error_str);
p.s. если исходные тексты у вас не генерируются в процессе работы программы, синтаксическую проверку лучше проводить заранее однократно, а не в процессе работы всего приложения.
- Спасибор за подсказку, попробую
- kolomat, а еще лучше - проводить проверку не однократно, а постоянно.
Пользуясь IDE, которая в них элементарно тычет носом еще при написании. - Adamos, да это понятно, простио в приложении конфиг дописывает обычный пользователь и они уже итак с синтаксисос натупили. Поэтому и хотел сделать какое то логирвоание что бы если что видели
- kolomat, если юзеру приходится программировать конфиг - имхо, это не он натупил...
- Adamos, это его желание а не мое)) Как сказали сделать, так и сделал)
- kolomat, совет, давай пользователю редактировать не настоящий файл, а его копию, само веб приложение перед открытием настоящего файла проверяет наличие новой редакции этого ненастоящего (на его изменения, т.е. сравнивать даты последней модификации ненастоящего и настоящего) и делать проверку на синтаксис, можно и другие проверки сделать, например наличие обязательных опций, верное указание данных (тип и структуры) и т.п.
При наличии ошибки выводить баннер-уведомление, что конфигурация пользователя не верная, ошибка в такой то строке (саму строку не выводить, а то там могут быть пароли) и использовать старый конфиг!
Если ошибок нет то заменять старую копию на новую (можно кстати и ее хранить для возможности откатить на предыдущий конфиг)
В итоге, проверка filemtime очень быстрая, это можно делать в рядовом include в любом месте веб приложения без деградации производительности, и не превращает в тыкву все приложение при ошибках.
- Хм, спасибо, интересная идея
- kolomat, так к слову, пользователь может захотеть хоть код писать, и ему это надо обеспечить. Но, это не значит, что нужно брать код пользователя и выполнять на сервере. Пользователь пишет код на своем DSL, а мы пишем парсер, который его обрабатывает и компилирует в легитимные конструкции уже исполняемого языка. Тоже самое с вашими конфигами, тоже самое с любыми данными приходящими от пользователя, они должны быть обработаны и проверены, для исключения любого внедрения недопустимого кода.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для эффективного логирования ошибок в PHP необходимо использовать специальные инструменты и методики, которые позволят быстро находить и исправлять проблемы в коде.
Первым шагом к правильному логированию ошибок является настройка уровня журналирования в PHP. Уровни журналирования могут быть установлены с помощью функции error_reporting(), которая определяет, какие типы ошибок будут логироваться. Например, можно установить уровень E_ALL, чтобы логировать все типы ошибок, или E_ERROR, чтобы логировать только фатальные ошибки.
Далее необходимо выбрать механизм логирования ошибок. PHP предоставляет несколько встроенных способов для этого, таких как использование функции error_log() для записи ошибок в файл, или настройка конфигурации php.ini для отправки ошибок на почту.
Также можно воспользоваться сторонними инструментами для логирования ошибок, такими как Monolog, который предоставляет более гибкие возможности конфигурации и фильтрации ошибок.
Помимо выбора механизма логирования, важно правильно форматировать сообщения об ошибках. Хорошая практика включает в себя информацию о времени возникновения ошибки, ее типе и местонахождении в коде. Это поможет быстрее определить причину ошибки и исправить ее.
Кроме того, для улучшения процесса логирования рекомендуется использовать систему отслеживания ошибок, которая будет позволять анализировать и отслеживать ошибки в реальном времени, а также предоставлять статистику по типам ошибок и их распределению.
В итоге, правильное логирование ошибок в PHP является важным шагом к улучшению качества кода и повышению эффективности разработки. Правильно настроенная система логирования позволит быстро находить и устранять ошибки, что в свою очередь повысит надежность и стабильность приложения.