От автора: я опять сегодня не выспался! Вчера отлавливал ошибки в написанном скрипте, а сегодня комар жужжал под ухом всю ночь. И кажется, что это насекомое сродни тому багу, который я прошлой ночью еле нашел. В общем, сегодня (раз уж мне не спится) узнаем о кодах ошибок в PHP.
Если их не видно
Причин, почему ошибки не выводятся на экране, может быть несколько:
Их вывод отключен хостером специально – таким образом он заботится о повышении безопасности своего серверного пространства. В том числе и вашего ресурса. И все потому, что в описаниях некоторых ошибок отладчик выводит конфиденциальную информацию. Умелый хакер сможет легко использовать ее для взлома вашего сайта. Например, при указании неправильного пароля при подключении к базе, расположенной на сервере MySQL. В результате на экран выводится описание ошибки, содержащее логин активного пользователя СУБД.
В файле .htaccess.
В настройках ядра языка.
Все эти «частные» случаи мы рассматривали в одном из наших предыдущих материалов. Но так как нами используется Денвер, то я кратко опишу решение данной проблемы в нем.
Перед тем, как найти ошибку коде PHP, сначала нужно ее вывести на экран. Если это не происходит, тогда прямая дорога в php.ini.Здесь нужно активировать значения нескольких параметров:
display_errors.
error_reporting.
display_startup_errors.
Данные настройки расположены в разделе «Error handling and logging».
Логов нет!
Как отмечалось ранее, в большинстве случает на хостингах вывод программных багов на веб-страницах отключен. Но это не значит, что они недоступны для отслеживания и отладки владельцам ресурсов. Все данные об ошибках записываются в файлы логов.
В Денвере данная функция (по умолчанию) отключена. Это можно легко исправить, прописав нужный код в конфигурационном файле (в том же разделе).
Снова откройте php.ini и внесите в него выделенные ниже строки. Точнее, одна из них уже должна быть, но лучше проверить. С помощью этих директив (log_errors и error_log) разрешается запись сообщений обо всех ошибках. А также задается путь к файлу логов, с помощью которого вы сможете осуществить PHP проверку кода на ошибки.
После редактирования конфигурационного файла перезапустите локальный сервер, чтобы все изменения вступили в силу.
Проверяем
Теперь проверим, что у нас вышло. Для этого запустим умышленную синтаксическую неточность в коде: неправильно объявим переменную PHP.
1 |
@!$ |
Теперь заглянем в созданный файл логов.
Как видим, в него записалась вся информация о допущенном баге. Здесь же мы натыкаемся на «упоминание» об одном из основных типов ошибок – parse error. Это говорит о том, что мы нарушили синтаксическое правило языка (объявление переменных).
Как можно еще проверить PHP код на ошибки? Применить функцию set_error_handler(), которая позволяет задать пользовательский обработчик. Но ее использование при включенном родном handler не имеет смысла. Кроме этого пользователь может перехватывать не все типы ошибок. Например, фатальные error вам (как и мне) переопределить не удастся. Пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php error_reporting(0); function user_handler($n, $str,$file, $line) { echo "Номер: ".$n."<br />". "Описание: ".$str." <br />". "Имя файла: ".$file."<br />". "Строка кода: ".$line; return true; } set_error_handler('user_handler', E_ALL); require("nofile.php"); ?> |
Сначала мы отключили нативный обработчик (error_reporting(0)). Затем создали собственную функцию и передали ее в качестве аргумента set_error_handler(). После чего инициировали ошибку, подключив несуществующий «в природе» файл.
Онлайн
Осуществить проверку кода PHP на ошибки также можно с помощью специализированных сервисов. Вот несколько из них: codepad, PHP Assist
А возле меня почему-то комаров стало больше! Или это звездочки летают? Пойду, наверное, посплю, пока ко мне дичь посерьезней (белочка) не прискакала :). Спокойной ночи!