From: Jani Taskinen Date: Tue, 24 Jul 2007 14:21:36 +0000 (+0000) Subject: MFH:- Changed "display_errors" php.ini option to accept "stderr" as value which X-Git-Tag: php-5.2.4RC1~59 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=335cac3c6a0e577d9c448289b6f318f73582554c;p=php MFH:- Changed "display_errors" php.ini option to accept "stderr" as value which MFH: makes the error messages to be outputted to STDERR instead of STDOUT with MFH: CGI and CLI SAPIs (FR #22839). --- diff --git a/NEWS b/NEWS index 46246401d8..7b1422caa9 100644 --- a/NEWS +++ b/NEWS @@ -12,6 +12,9 @@ PHP NEWS - Enabled changing the size of statement cache for non-persistent OCI8 connections. (Chris Jones, Tony) +- Changed "display_errors" php.ini option to accept "stderr" as value which + makes the error messages to be outputted to STDERR instead of STDOUT with + CGI and CLI SAPIs (FR #22839). (Jani) - Changed error handler to send HTTP 500 instead of blank page on PHP errors. (Dmitry, Andrei Nigmatulin) - Changed mail() function to be always available. (Johannes) diff --git a/main/main.c b/main/main.c index 967591d1cb..3c397bd4fb 100644 --- a/main/main.c +++ b/main/main.c @@ -213,6 +213,89 @@ static PHP_INI_MH(OnUpdateTimeout) } /* }}} */ +/* {{{ php_get_display_errors_mode() helper function + */ +static int php_get_display_errors_mode(char *value, int value_length) +{ + int mode; + + if (value_length == 2 && !strcasecmp("on", value)) { + mode = PHP_DISPLAY_ERRORS_STDOUT; + } else if (value_length == 3 && !strcasecmp("yes", value)) { + mode = PHP_DISPLAY_ERRORS_STDOUT; + } else if (value_length == 4 && !strcasecmp("true", value)) { + mode = PHP_DISPLAY_ERRORS_STDOUT; + } else if (value_length == 6 && !strcasecmp(value, "stderr")) { + mode = PHP_DISPLAY_ERRORS_STDERR; + } else if (value_length == 6 && !strcasecmp(value, "stdout")) { + mode = PHP_DISPLAY_ERRORS_STDOUT; + } else { + mode = atoi(value); + if (mode && mode != PHP_DISPLAY_ERRORS_STDOUT && mode != PHP_DISPLAY_ERRORS_STDERR) { + mode = PHP_DISPLAY_ERRORS_STDOUT; + } + } + return mode; +} +/* }}} */ + +/* {{{ PHP_INI_MH + */ +static PHP_INI_MH(OnUpdateDisplayErrors) +{ + PG(display_errors) = (zend_bool) php_get_display_errors_mode(new_value, new_value_length); + + return SUCCESS; +} +/* }}} */ + +/* {{{ PHP_INI_DISP + */ +static PHP_INI_DISP(display_errors_mode) +{ + int mode, tmp_value_length, cgi_or_cli; + char *tmp_value; + + if (type == ZEND_INI_DISPLAY_ORIG && ini_entry->modified) { + tmp_value = (ini_entry->orig_value ? ini_entry->orig_value : NULL ); + tmp_value_length = ini_entry->orig_value_length; + } else if (ini_entry->value) { + tmp_value = ini_entry->value; + tmp_value_length = ini_entry->value_length; + } else { + tmp_value = NULL; + tmp_value_length = 0; + } + + mode = php_get_display_errors_mode(tmp_value, tmp_value_length); + + /* Display 'On' for other SAPIs instead of STDOUT or STDERR */ + cgi_or_cli = (!strcmp(sapi_module.name, "cli") || !strcmp(sapi_module.name, "cgi")); + + switch (mode) { + case PHP_DISPLAY_ERRORS_STDERR: + if (cgi_or_cli ) { + PUTS("STDERR"); + } else { + PUTS("On"); + } + break; + + case PHP_DISPLAY_ERRORS_STDOUT: + if (cgi_or_cli ) { + PUTS("STDOUT"); + } else { + PUTS("On"); + } + break; + + default: + PUTS("Off"); + break; + } +} +/* }}} */ + /* Need to convert to strings and make use of: * PHP_SAFE_MODE * @@ -246,7 +329,7 @@ PHP_INI_BEGIN() STD_PHP_INI_BOOLEAN("allow_call_time_pass_reference", "1", PHP_INI_SYSTEM|PHP_INI_PERDIR, OnUpdateBool, allow_call_time_pass_reference, zend_compiler_globals, compiler_globals) STD_PHP_INI_BOOLEAN("asp_tags", "0", PHP_INI_SYSTEM|PHP_INI_PERDIR, OnUpdateBool, asp_tags, zend_compiler_globals, compiler_globals) - STD_PHP_INI_BOOLEAN("display_errors", "1", PHP_INI_ALL, OnUpdateBool, display_errors, php_core_globals, core_globals) + STD_PHP_INI_ENTRY_EX("display_errors", "1", PHP_INI_ALL, OnUpdateDisplayErrors, display_errors, php_core_globals, core_globals, display_errors_mode) STD_PHP_INI_BOOLEAN("display_startup_errors", "0", PHP_INI_ALL, OnUpdateBool, display_startup_errors, php_core_globals, core_globals) STD_PHP_INI_BOOLEAN("enable_dl", "1", PHP_INI_SYSTEM, OnUpdateBool, enable_dl, php_core_globals, core_globals) STD_PHP_INI_BOOLEAN("expose_php", "1", PHP_INI_SYSTEM, OnUpdateBool, expose_php, php_core_globals, core_globals) @@ -809,7 +892,14 @@ static void php_error_cb(int type, const char *error_filename, const uint error_ php_printf("%s
\n%s: %s in %s on line %d
\n%s", STR_PRINT(prepend_string), error_type_str, buffer, error_filename, error_lineno, STR_PRINT(append_string)); } } else { - php_printf("%s\n%s: %s in %s on line %d\n%s", STR_PRINT(prepend_string), error_type_str, buffer, error_filename, error_lineno, STR_PRINT(append_string)); + /* Write CLI/CGI errors to stderr if display_errors = "stderr" */ + if ((!strcmp(sapi_module.name, "cli") || !strcmp(sapi_module.name, "cgi")) && + PG(display_errors) == PHP_DISPLAY_ERRORS_STDERR + ) { + fprintf(stderr, "%s: %s in %s on line %d\n", error_type_str, buffer, error_filename, error_lineno); + } else { + php_printf("%s\n%s: %s in %s on line %d\n%s", STR_PRINT(prepend_string), error_type_str, buffer, error_filename, error_lineno, STR_PRINT(append_string)); + } } } } diff --git a/main/php_globals.h b/main/php_globals.h index 928211d552..6c796d2c76 100644 --- a/main/php_globals.h +++ b/main/php_globals.h @@ -33,7 +33,11 @@ extern PHPAPI int core_globals_id; extern ZEND_API struct _php_core_globals core_globals; #endif +/* Error display modes */ +#define PHP_DISPLAY_ERRORS_STDOUT 1 +#define PHP_DISPLAY_ERRORS_STDERR 2 +/* Track vars */ #define TRACK_VARS_POST 0 #define TRACK_VARS_GET 1 #define TRACK_VARS_COOKIE 2 diff --git a/php.ini-dist b/php.ini-dist index 3a210dfb2a..ee78bbe462 100644 --- a/php.ini-dist +++ b/php.ini-dist @@ -309,6 +309,16 @@ error_reporting = E_ALL & ~E_NOTICE ; instead (see below). Keeping display_errors enabled on a production web site ; may reveal security information to end users, such as file paths on your Web ; server, your database schema or other information. +; +; possible values for display_errors: +; +; Off - Do not display any errors +; stderr - Display errors to STDERR (affects only CGI/CLI binaries!) +; +;display_errors = "stderr" +; +; stdout (On) - Display errors to STDOUT +; display_errors = On ; Even when display_errors is on, errors that occur during PHP's startup diff --git a/php.ini-recommended b/php.ini-recommended index 07fe25c61d..3d18d97c31 100644 --- a/php.ini-recommended +++ b/php.ini-recommended @@ -357,6 +357,18 @@ error_reporting = E_ALL ; instead (see below). Keeping display_errors enabled on a production web site ; may reveal security information to end users, such as file paths on your Web ; server, your database schema or other information. +; +; possible values for display_errors: +; +; Off - Do not display any errors +; stderr - Display errors to STDERR (affects only CGI/CLI binaries!) +; On or stdout - Display errors to STDOUT (default) +; +; To output errors to STDERR with CGI/CLI: +;display_errors = "stderr" +; +; Default +; display_errors = Off ; Even when display_errors is on, errors that occur during PHP's startup