]> granicus.if.org Git - php/commitdiff
MFH:- Changed "display_errors" php.ini option to accept "stderr" as value which
authorJani Taskinen <jani@php.net>
Tue, 24 Jul 2007 14:21:36 +0000 (14:21 +0000)
committerJani Taskinen <jani@php.net>
Tue, 24 Jul 2007 14:21:36 +0000 (14:21 +0000)
MFH:  makes the error messages to be outputted to STDERR instead of STDOUT with
MFH:  CGI and CLI SAPIs (FR #22839).

NEWS
main/main.c
main/php_globals.h
php.ini-dist
php.ini-recommended

diff --git a/NEWS b/NEWS
index 46246401d8ed6576f69243542c8d4268fd25ac22..7b1422caa9713a5d2331c0e233121696d173a541 100644 (file)
--- 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)
index 967591d1cb2afe94a9e17c6ba973a8e2ed29468f..3c397bd4fb6bc6e9db83a7ec7d535967a268a2cc 100644 (file)
@@ -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<br />\n<b>%s</b>:  %s in <b>%s</b> on line <b>%d</b><br />\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));
+                                       }
                                }
                        }
                }
index 928211d5522394965ce2da73e39a2321f20f96e9..6c796d2c7668c5ccb7a4e131640f4172c4e96a51 100644 (file)
@@ -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
index 3a210dfb2afb873a2c1b2cbcb712eb8faf6ee4eb..ee78bbe462283bfb96ef2d3c51b965e05ea76dae 100644 (file)
@@ -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
index 07fe25c61dd9fac76584d2d7daca38bd4d7e97d9..3d18d97c31e5536db68c4fd5dca3b266e6995374 100644 (file)
@@ -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