Обнаружил некую невосместимость версий PHP в плане обработки ошибок
скриптов в режиме FastCGI.
Если в обрабатываемом скрипте есть ошибка (например, функция не
определена), то PHP 4.3.2 возвращает результат в записи типа
FCGI_STDOUT, в то время как PHP 4.3.11 из CVS пишет в FCGI_STDERR, а
этот тип FCGI записи nginx-ом не обрабатывается.
Пример из жизни, PHP 4.3.2, в скрипте не определена функция:
2005/02/17 13:41:50 [debug] 7671#0: *243 pipe recv chain: 0
2005/02/17 13:41:50 [debug] 7671#0: *243 pipe buf free s:0 t:1 f:0
080D0260, pos 080D029C, size: 28 file: 0, size: 0
Теперь PHP 4.3.11-dev:
2005/02/17 04:53:24 [debug] 11900#0: *422 recv: fd:60 112 of 32768
2005/02/17 04:53:24 [debug] 11900#0: *422 http fastcgi record byte: 01
Эксперименты показывают, что только некоторые ошибки лезут в
FCGI_STDERR. Скажем, деление на ноль и неопределенная функция идут в
stderr, а просто parse error оправляется в stdout. В общем, непонятки.
Тем не менее, может быть, добавить поддержку FCGI_STDERR в nginx?
Логически он не сильно отличается от FCGI_STDOUT. Тем более что в спеке
написано:
Use of the FCGI_STDERR stream is always optional. If an application has
no errors to report, it sends either no FCGI_STDERR records or one
zero-length FCGI_STDERR record.
Т.е. бэкенд запросто может послать FCGI_STDERR, даже если ошибки не было.
Вчера вечером я доделал поддержку FCGI_STDERR. До этого она не работала.
Мне просто не на чем было потестировать FCGI_STDERR, php про ошибки
писал в FCGI_STDOUT.
Через полчаса будет 0.1.20. Хорошо бы в нём потестировать FCGI_STDERR.
Игорь Сысоев
http://sysoev.ru