Странная внутренняя ошибка сервера 500 (firebug, php, display_errors, ajax)
-
19-09-2019 - |
Вопрос
На одной странице я выполняю несколько вызовов AJAX.Все вызовы успешно возвращают ответы, но последний (не связанный с другими вызовами ajax) возвращает внутреннюю ошибку сервера 500 в виде кода ответа (как сообщает firebug).Однако, несмотря на код ошибки, правильное содержимое возвращается из этого вызова AJAX.
К моему удивлению, когда я устанавливаю параметр display_errors в php.ini как Вкл., ошибка исчезает, а ответ отображается на странице.У меня есть запись ошибки настройки в файл, но ошибка, соответствующая вышеупомянутой внутренней ошибке сервера, не регистрируется.
Кстати, я использую Apache, jQuery, PHP5, APC (если это уместно).
Нет правильного решения
Другие советы
Наиболее вероятный ответ, учитывая ограниченную доступную информацию, заключается в том, что PHP выдает фатальную ошибку после он закончил повторять ваш ожидаемый результат.
Чтобы проверить:в строке, которая выполняется последней, повторите что-нибудь.Если это эхо не отображается, значит, вы знаете, что ваш PHP-скрипт где-то останавливается.На этом этапе это всего лишь вопрос отладки и трассировки.
Это очень странно...Используете ли вы какую-то библиотеку или другой код, который ты не писал это может влиять на заголовок кода состояния независимо от фактического возвращаемого значения?
У меня была точно такая же проблема, оказавшаяся скрытой Фатальной ошибкой.Включите display_errors, найдите ошибку, устраните ошибку, отключите display_errors (вероятно, лучше всего оставить display_errors включенным для разработки и выключенным в производстве).
Интерпретатор PHP просто выходит из строя во время этого одного запроса.Я знаю одну потенциальную причину, которая может привести к сбою PHP:
Из-за некоторых ошибок в GCC 4.3 в PHP, скомпилированном с помощью этой версии компилятора, нарушена реализация исключений.В некоторых нетривиальных случаях выдача скриптом исключения приводит к segfault и выполнение скрипта прекращается.Тезис был подтвержден командой PHP пару месяцев назад.
Чтобы проверить, происходит ли это с вами, вы можете просто проверить, где происходит сбой при выполнении скрипта, и если это происходит сразу после создания исключения, вы дома.Проверка может быть произведена путем размещения die()
продвигайтесь дальше по сценарию и смотрите, что получится.Другой способ заключается в использовании declare(ticks=1)
и зарегистрируйте функцию tick, которая сохраняет последнюю запись из debug_backtrace()
добавляйте в файл каждую галочку, чтобы вы получали отчет о том, как выполняется скрипт.
У меня была несколько похожая проблема, и проблема заключалась в том, что скрипт выбрасывал исключения, а блока catch не было, поэтому исключение всплывало на поверхность и возникала неустранимая ошибка "неперехваченное исключение".Это стандартное поведение php, но на одном конкретном сервере вы также получили бы код ответа 500 internal server error вместо 200 OK.Удаление исключений и замена их операторами die() устранили проблему на этом сервере (мы могли бы это сделать, потому что это был простой скрипт, который на самом деле не выигрывал от исключений в первую очередь)
Проблема часто устраняется одним из следующих способов.Проверьте разрешения скриптов, права и принадлежность.Если возвращается после вызова ajax, проверьте, нет ли нигде неустранимой ошибки.Проверьте, не перекодировали ли вы случайно файл в Unix в режиме ASCII.
Более подробную информацию можно прочитать по адресу http://www.larshemel.com/forum/500_internal_server_error