Я запускаю Apache 2.2.15 с PHP 5.3.2, отключен display_errors, отключен display_startup_errors, включен log_errors.
В моей настройке (поэтому я считаю ее нормой) PHP прерывает фатальные ошибки, что хорошо, и устанавливает код состояния HTTP на 500. Неустранимая ошибки включают E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR, E_USER_ERROR и, возможно, E_RECOVERABLE_ERROR (не может запускать его сам, поэтому не может легко проверить, что происходит). Я думаю, что это хорошая идея, что он устанавливает код в 500, потому что я думаю, что это правильная вещь - очевидно, если ваш script содержит синтаксические ошибки и/или не выполняет то, что должно выполняться во время выполнения, это ошибка сервера, если мы рассматриваем PHP-часть сервера.
Теперь, вот важная часть:
В любом случае, я теперь установил XDebug для лучшего отслеживания ошибок, но теперь я вижу, что независимо от этой ошибки, несмотря на то, что script прерывается, как и раньше, при фатальных ошибках, код состояния HTTP всегда равен 200. Это прерывает мой клиент, который "разговаривает" с Apache/PHP через HTTP: |
Кроме того, при установке display_errors в On/1, PHP больше не устанавливает код состояния HTTP на 500 и демонстрирует то же поведение, что и с XDebug выше.
Я очень сильно зависим от надежного поведения кода состояния здесь, и это все заставляет меня поверить в какую-то случайность или случайную погоду.. или я что-то пропустил?
UPDATE
Есть сообщение в блоге, в котором проблема: http://talideon.com/weblog/2008/02/php-errors.cfm
Со своей стороны, я отключил XDebug, потому что это то, что вызывает плохое поведение в первую очередь. Я использовал его для трассировки стека в любом случае, а теперь вместо него использую собственный обработчик ошибок. Кроме того, связанная статья с 2008 года, по-видимому, PHP делает автоматически устанавливает код состояния HTTP на 500 в эти дни. Он делает это здесь. Без XDebug, конечно.