Каков наилучший способ получить ошибки с рабочего сайта на PHP?
Для большинства производственных сайтов вы хотите знать, когда произошла ошибка, как можно скорее. Мой вопрос, как лучше всего получить эту информацию.
Обычно, вероятно, лучше получать ошибки в электронном письме, так как я не собираюсь сидеть каждый день и просматривать журналы ошибок до тех пор, пока не возникнет ошибка - это было бы невозможно, поскольку у меня 20 или более рабочих сайтов на разных серверах. Эти ошибки могут быть любыми, включая неустановленные переменные, полученные неверные данные или ошибки запроса.
На данный момент я последовал примеру на сайтах PHP, найденных здесь. В результате он создает текстовую строку вместе с файлом XML, который затем отправляется по электронной почте. Я немного изменил это, чтобы сохранить все ошибки до конца скрипта, а затем отправить электронное письмо с прикрепленными файлами XML. (Я разбил пару почтовых серверов, отправляющих более 500 000 писем из-за ошибки в цикле.) В большинстве случаев это работает отлично. (Я также создал объект для выполнения всей обработки ошибок.)
Проблема возникает, когда существует большой объем данных для wddx_serialize_value()
к процессам. И затем, если есть несколько ошибок, это действительно приводит к использованию большого количества памяти, в большинстве случаев больше, чем разрешено использовать сценарию.
Из-за этого я добавил дополнение gzcompress()
в файл XML перед сохранением его в переменной. Это помогает, но если объем данных очень велик, ему все равно не хватает памяти. (В недавнем случае он хотел использовать около 2 ГБ.)
Мне интересно, какие еще есть решения или как вы изменили это, чтобы оно работало?
Итак, несколько требований:
- он должен иметь возможность отправлять мне больше, чем просто сообщение об ошибке, и не должен заставлять меня входить в систему на сервере, чтобы выяснить, что произошло (поэтому я могу проверить мобильность и определить, срочно ли это)
- должно быть ограничение на количество отправленных писем. Лучше всего 1.
- это должно войти в файл как обычно
Изменить: мне нужна другая информация, связанная с ошибкой, а не только строка ошибки. Часто я нахожу, что почти невозможно воспроизвести ошибку, потому что она вызвана пользовательским вводом, который я не знаю, пока не получу больше информации. Я старался изо всех сил вводить информативные ошибки, но вы никогда не знаете, как пользователь будет использовать систему или какие данные дерьма они будут вводить. Поэтому мне нужно больше, чем просто текст ошибки / строка.
Редактировать 2: Не могу записать ошибки в базу данных, потому что, насколько я знаю, базы данных там может не быть. Нужно что-то, что в значительной степени гарантированно работает Кроме того, сайты не все на 1 сервере, и я часто не имею доступа к cron на сервере (глупые хостинговые компании).
4 ответа
Одним из подходов может быть правильное управление исключениями в вашем приложении, то есть контроль над тем, какие ошибки регистрируются.
Каждое возбужденное исключение регистрирует подробности ошибки в базе данных.
Затем вы можете написать небольшое приложение для поиска в базе данных ошибок, может быть, только одно для всех ваших сайтов.
Таким образом вы избегаете больших нечитаемых файлов журналов, потому что все проиндексировано и быстро доступно для поиска. Когда ваша база данных становится слишком большой, вы можете обрезать таблицы журналов с помощью заданий cron.
Вместо того, чтобы устанавливать собственный обработчик ошибок, я, как обычно, позволяю ошибкам идти в журнал ошибок. Я установил cron, который периодически запускается и отслеживает изменения в журнале ошибок - если он изменился, он отправляет мне электронное письмо только с изменениями. Вы можете улучшить этот процесс и проанализировать изменения, чтобы лучше соответствовать вашим потребностям - например, отправлять вам только ошибки выше определенного уровня (например, E_WARNING и выше).
Одна вещь, которую я использовал в прошлом, это epylog, это очень гибкое приложение для мониторинга журналов, написанное на python. Вы можете настроить его для отслеживания журналов ошибок и включения ошибок (или их частей) в сводку журналов, отправленную вам по электронной почте.
Я бы предпочел сохранить более подробные данные об ошибках в простом файле на сервере и отправить вам электронное письмо с просьбой проверить журнал. Задание cron, которое просматривает каталог ошибок или файлы на предмет изменений и имеет установленный предел скорости, было бы хорошим способом минимизировать влияние на работающее приложение.
Anacron, задание cron, которое отправляет по электронной почте изменения в журнал ошибок * и файл журнала ошибок, должно быть достаточным. Задание cron может выполнить всю необходимую обработку перед отправкой электронного письма.