PHP 4.3.11 из CVS и ошибки PHP скриптов

Mike Kolesnikov mozilla_bugs at mail.ru
Thu Feb 17 14:19:48 MSK 2005


Добрый день.

Обнаружил некую невосместимость версий 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
2005/02/17 13:41:50 [debug] 7671#0: *243 http fastcgi record byte: 01
2005/02/17 13:41:50 [debug] 7671#0: *243 http fastcgi record byte: 06
2005/02/17 13:41:50 [debug] 7671#0: *243 http fastcgi record byte: 00
2005/02/17 13:41:50 [debug] 7671#0: *243 http fastcgi record byte: 01
2005/02/17 13:41:50 [debug] 7671#0: *243 http fastcgi record byte: 00
2005/02/17 13:41:50 [debug] 7671#0: *243 http fastcgi record byte: 00
2005/02/17 13:41:50 [debug] 7671#0: *243 http fastcgi record byte: 00
2005/02/17 13:41:50 [debug] 7671#0: *243 http fastcgi record byte: 00
2005/02/17 13:41:50 [debug] 7671#0: *243 http fastcgi record length: 0
2005/02/17 13:41:50 [debug] 7671#0: *243 http fastcgi closed stdout
2005/02/17 13:41:50 [debug] 7671#0: *243 http fastcgi record byte: 01
2005/02/17 13:41:50 [debug] 7671#0: *243 http fastcgi record byte: 03
2005/02/17 13:41:50 [debug] 7671#0: *243 http fastcgi record byte: 00
2005/02/17 13:41:50 [debug] 7671#0: *243 http fastcgi record byte: 01
2005/02/17 13:41:50 [debug] 7671#0: *243 http fastcgi record byte: 00
2005/02/17 13:41:50 [debug] 7671#0: *243 http fastcgi record byte: 08
2005/02/17 13:41:50 [debug] 7671#0: *243 http fastcgi record byte: 00
2005/02/17 13:41:50 [debug] 7671#0: *243 http fastcgi record byte: 00
2005/02/17 13:41:50 [debug] 7671#0: *243 http fastcgi record length: 8
2005/02/17 13:41:50 [debug] 7671#0: *243 http fastcgi sent end request


Теперь 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
2005/02/17 04:53:24 [debug] 11900#0: *422 http fastcgi record byte: 07
2005/02/17 04:53:24 [debug] 11900#0: *422 http fastcgi record byte: 00
2005/02/17 04:53:24 [debug] 11900#0: *422 http fastcgi record byte: 01
2005/02/17 04:53:24 [debug] 11900#0: *422 http fastcgi record byte: 00
2005/02/17 04:53:24 [debug] 11900#0: *422 http fastcgi record byte: 5A
2005/02/17 04:53:24 [debug] 11900#0: *422 http fastcgi record byte: 06
2005/02/17 04:53:24 [debug] 11900#0: *422 http fastcgi record byte: 00
2005/02/17 04:53:24 [debug] 11900#0: *422 http fastcgi record length: 90
2005/02/17 04:53:24 [error] 11900#0: *422 upstream sent unexpected
FastCGI record: 7 while reading response header from upstream, client:
12.156.2.52, URL: /test/1.php, upstream: fastcgi://127.0.0.1:1234/test/1.php
2005/02/17 04:53:24 [debug] 11900#0: *422 http next upstream, 8
2005/02/17 04:53:24 [debug] 11900#0: *422 finalize http upstream
request: 502
2005/02/17 04:53:24 [debug] 11900#0: *422 finalize http fastcgi request

Эксперименты показывают, что только некоторые ошибки лезут в
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, даже если ошибки не было.





More information about the nginx-ru mailing list