Как правильно лоигровать ошибки php?

Ссылка скопирована
PHP
7 апреля 2026 1 ответ

Добрый день, подскажите по такому вопросу. Не могу понять как правильно лигироать все ошибки 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, а мы пишем парсер, который его обрабатывает и компилирует в легитимные конструкции уже исполняемого языка. Тоже самое с вашими конфигами, тоже самое с любыми данными приходящими от пользователя, они должны быть обработаны и проверены, для исключения любого внедрения недопустимого кода.
Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Дмитрий К. Ответ

Для эффективного логирования ошибок в PHP необходимо использовать специальные инструменты и методики, которые позволят быстро находить и исправлять проблемы в коде.

Первым шагом к правильному логированию ошибок является настройка уровня журналирования в PHP. Уровни журналирования могут быть установлены с помощью функции error_reporting(), которая определяет, какие типы ошибок будут логироваться. Например, можно установить уровень E_ALL, чтобы логировать все типы ошибок, или E_ERROR, чтобы логировать только фатальные ошибки.

Далее необходимо выбрать механизм логирования ошибок. PHP предоставляет несколько встроенных способов для этого, таких как использование функции error_log() для записи ошибок в файл, или настройка конфигурации php.ini для отправки ошибок на почту.

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

Помимо выбора механизма логирования, важно правильно форматировать сообщения об ошибках. Хорошая практика включает в себя информацию о времени возникновения ошибки, ее типе и местонахождении в коде. Это поможет быстрее определить причину ошибки и исправить ее.

Кроме того, для улучшения процесса логирования рекомендуется использовать систему отслеживания ошибок, которая будет позволять анализировать и отслеживать ошибки в реальном времени, а также предоставлять статистику по типам ошибок и их распределению.

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

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно