PHP 5.3 — Устранение ошибок 500 — Отладка — Разбор ошибок

Иногда у меня будет плохо сформированный PHP-код, и я получу ошибку 500. Я использую Apache 2.2 на ноутбуке с Windows 7. В качестве IDE я начал использовать PhpStorm.

Каков наилучший способ поймать эти ошибки и получить информацию о номере строки? Почему синтаксические ошибки, связанные с ООП, имеют тенденцию вызывать 500 ошибок, а проблемы с функциями, как правило, возвращают обычные ошибки?

Пример синтаксической ошибки: вызов статического метода из класса с одним двоеточием вместо двух.

ОБНОВЛЕНИЕ: см. принятый ответ и все комментарии.


person BuddyJoe    schedule 19.12.2011    source источник
comment
Я не уверен, что вы подразумеваете под нормальными ошибками? Если код не может быть проанализирован из-за синтаксической ошибки, я ожидаю 500 от веб-сервера с подробной информацией об ошибке компиляции в журналах (не на дисплее для пользователя).   -  person David    schedule 19.12.2011


Ответы (1)


PHP ответит «500», когда обнаружит фатальную ошибку, такую ​​как E_PARSE, E_ERROR и необработанные исключения. 500 — это код ответа HTTP для «Внутренней ошибки сервера» — во время обработки запроса произошло что-то неисправимое.

В вашем php.ini на машине разработки вы должны установить свой error_reporting до (как минимум) E_NOTICE - предпочтительно E_ALL - и убедитесь, что display_errors включен. Это покажет вам сообщение об ошибке в браузере, в том числе для ошибок «500».

Вы также можете проверить свои журналы ошибок Apache, ошибки будут перечислены там, если log_errors включен в php.ini. По умолчанию это будет <apache_ServerRoot>\logs\error.log.

Вы также можете управлять всем этим во время выполнения с помощью ini_set() и error_reporting()

person DaveRandom    schedule 19.12.2011
comment
Эта статическая ситуация должна быть ошибкой E_PARSE. Было так сложно найти проблему - я думал, что должен быть лучший способ. - person BuddyJoe; 19.12.2011
comment
@brunot, если вы не видите сообщения с включенным error_reporting, скорее всего, display_errors выключен. Бывают ситуации, в которых сообщение об ошибке не будет выведено, но это действительно только в том случае, если что-то пошло не так с PHP внутри, и произошел сбой. Когда это происходит, в журналах Apache обычно появляется сообщение, говорящее вам, что это произошло, хотя отладка, почему это произошло, действительно может быть очень сложной. В этой ситуации запуск скрипта из командной строки иногда помогает получить полезное сообщение об ошибке, но не всегда. - person DaveRandom; 19.12.2011
comment
@brunot Для поиска ошибок E_PARSE вы можете загрузить скрипт из командной строки с параметром -l (lint), и он выдаст вам сообщение об ошибке с указанием номера строки, в которой произошла ошибка синтаксического анализа. - person DaveRandom; 19.12.2011
comment
Копнул немного глубже (надеясь, что вы подтвердите, что это звучит правильно) - но когда я установил display_errors = On в ini напрямую, а не делал это из верхней части скрипта... проблема возникла :). Спасибо за метод линта. Это тоже очень поможет! - person BuddyJoe; 19.12.2011
comment
Да, если это ошибка синтаксического анализа, ни один из ваших кодов не выполняется, поэтому ваш вызов ini_set() не имеет значения. Единственным исключением из этого правила является include() файл, который не анализируется, и в этом случае код перед вызовом include будет выполнен. Это (насколько мне известно) единственный тип ошибки времени выполнения, для которого это верно. Но в среде разработки вы все равно всегда должны показывать все ошибки, чтобы вы могли их поймать и исправить, поэтому лучше всего установить это в php.ini :-) - person DaveRandom; 19.12.2011