Внутренняя ошибка сервера Weird 500 (firebug, php, display_errors, ajax)

На одной странице я выполняю несколько вызовов AJAX. Все вызовы возвращают ответы успешно, но последний (не связанный с другими вызовами ajax) возвращает внутреннюю ошибку сервера 500 в качестве кода ответа (как сообщает firebug). Однако, несмотря на код ошибки, этот вызов AJAX возвращает правильный контент.

К моему удивлению, когда я устанавливаю для параметра display_errors в php.ini значение On, ошибка исчезает, и на странице отображается ответ. У меня есть запись ошибок настройки в файл, но не регистрируется ошибка, соответствующая вышеупомянутой внутренней ошибке сервера.

Кстати, я использую Apache, JQuery, PHP5, APC (если актуально).


person Paras Chopra    schedule 26.07.2009    source источник
comment
Не вопрос. К тому же вы не предоставляете достаточно подробностей, чтобы ответить на подразумеваемый вопрос: «Что случилось?».   -  person hobodave    schedule 26.07.2009
comment
Я согласен с тем, что для этого требуется больше информации, но проголосовал за, потому что это интересная ситуация.   -  person Gabriel Hurley    schedule 26.07.2009
comment
@hobodave, какая еще информация вам нужна? Если это помогает: фрагмент кода, который приводит к ошибке, фактически отвечает строкой JSON со строкой XML в качестве одного из значений переменной.   -  person Paras Chopra    schedule 26.07.2009
comment
У меня тоже такая же проблема, и установка display_errors On «устраняет» проблему, но ничего не регистрируется.   -  person brendo    schedule 10.01.2012


Ответы (6)


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

Чтобы проверить: в строке, которая выполняется последней, повторите что-нибудь. Если это эхо не появляется, значит, вы знаете, что ваш PHP-скрипт где-то останавливается. В этот момент это просто вопрос отладки и трассировки.

person thedz    schedule 26.07.2009

Это очень странно ... Вы используете какую-то библиотеку или другой код, который не вы писали, который может влиять на заголовок кода состояния независимо от фактического возвращаемого значения?

person Gabriel Hurley    schedule 26.07.2009
comment
Да, я использую библиотеку под названием FlourishLib, но я не ожидаю, что она создаст проблемы, поскольку одно и то же программное обеспечение работает без сбоев на другом сервере. - person Paras Chopra; 26.07.2009

У меня была такая же проблема, которая оказалась скрытой фатальной ошибкой. Включите display_errors, найдите ошибку, smash error, выключите display_errors (вероятно, лучше всего оставить display_errors включенным для разработки и выключить в производственной среде).

person Bryan Sloan    schedule 11.06.2014

Интерпретатор PHP просто дает сбой во время одного этого запроса. Я знаю одну потенциальную причину, которая может привести к сбою PHP:

Из-за некоторых ошибок в GCC 4.3 в PHP, скомпилированном с этой версией компилятора, нарушена реализация исключений. В некоторых нетривиальных случаях вызов исключения сценарием вызывает segfault и выполнение сценария прекращается. Тезис был подтвержден командой PHP пару месяцев назад.

Чтобы проверить, происходит ли это с вами, вы можете просто проверить, где происходит сбой выполнения скрипта, и если это происходит сразу после выброса исключения, вы дома. Проверить можно, поместив die() дальше и дальше в скрипт и посмотрим, что произойдет. Другой способ - использовать declare(ticks=1) и зарегистрировать функцию тика, которая сохраняет последнюю запись из debug_backtrace() в файл каждый тик, чтобы вы получали отчет о том, как выполняется скрипт.

person Zyx    schedule 26.07.2009

У меня была аналогичная проблема, и проблема заключалась в том, что сценарий генерировал исключения и не было блока перехвата, поэтому исключение всплывало на поверхность, и произошла фатальная ошибка «неперехваченное исключение». Это стандартное поведение php, но на одном конкретном сервере вы также получите код ответа 500 внутренней ошибки сервера вместо 200 OK. Удаление исключений и замена их операторами die () устранили проблему на этом сервере (мы могли это сделать, потому что это был простой скрипт, который действительно не выигрывал от исключений в первую очередь)

person brkonja    schedule 28.10.2009

Проблема часто решается следующими причинами. Проверьте разрешения, права и владение скриптами. Если возвращается после вызова ajax, проверьте, нет ли фатальной ошибки. Проверьте, не загрузили ли вы файл случайно в Unix в режиме ASCII.

Дополнительную информацию можно найти на странице http://www.larshemel.com/forum/500_internal_server_error

person Frits Schoenebeek    schedule 10.08.2010