Attached patch (if it comes through, Ins Allah :) overloads the
display_errors directive to accept 'stderr' as parameter which makes the
errors output to STDERR on CLI/CGI.
Applies to PHP_5_2 branch. Default is still STDOUT.
--Jani
Index: main/main.c
===================================================================
RCS file: /repository/php-src/main/main.c,v
retrieving revision 1.640.2.23.2.46
diff -u -r1.640.2.23.2.46 main.c
--- main/main.c 15 Jul 2007 15:34:28 -0000 1.640.2.23.2.46
+++ main/main.c 18 Jul 2007 15:05:47 -0000
@@ -213,6 +213,84 @@
}
/* }}} */
+/* {{{ PHP_INI_MH
+ */
+static PHP_INI_MH(OnUpdateDisplayErrors)
+{
+ int mode = 0;
+
+ if (new_value_length == 2 && !strcasecmp("on", new_value)) {
+ mode = PHP_DISPLAY_ERRORS_STDOUT;
+ } else if (new_value_length == 3 && !strcasecmp("yes", new_value)) {
+ mode = PHP_DISPLAY_ERRORS_STDOUT;
+ } else if (new_value_length == 4 && !strcasecmp("true", new_value)) {
+ mode = PHP_DISPLAY_ERRORS_STDOUT;
+ } else if (new_value_length == 6 && !strcasecmp(new_value, "stderr")) {
+ mode = PHP_DISPLAY_ERRORS_STDERR;
+ } else if (new_value_length == 6 && !strcasecmp(new_value, "stdout")) {
+ mode = PHP_DISPLAY_ERRORS_STDOUT;
+ } else {
+ mode = atoi(new_value);
+ if (mode && mode != PHP_DISPLAY_ERRORS_STDOUT && mode != PHP_DISPLAY_ERRORS_STDERR) {
+ mode = PHP_DISPLAY_ERRORS_STDOUT;
+ }
+ }
+ PG(display_errors) = (long) mode;
+ return SUCCESS;
+}
+/* }}} */
+
+/* {{{ PHP_INI_DISP
+ */
+static PHP_INI_DISP(display_errors_mode)
+{
+ int mode, tmp_value_len;
+ 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_len = ini_entry->orig_value_length;
+ } else if (ini_entry->value) {
+ tmp_value = ini_entry->value;
+ tmp_value_len = ini_entry->value_length;
+ } else {
+ tmp_value = NULL;
+ tmp_value_len = 0;
+ }
+
+ if (tmp_value_len == 2 && !strcasecmp("on", tmp_value)) {
+ mode = PHP_DISPLAY_ERRORS_STDOUT;
+ } else if (tmp_value_len == 3 && !strcasecmp("yes", tmp_value)) {
+ mode = PHP_DISPLAY_ERRORS_STDOUT;
+ } else if (tmp_value_len == 4 && !strcasecmp("true", tmp_value)) {
+ mode = PHP_DISPLAY_ERRORS_STDOUT;
+ } else if (tmp_value_len == 6 && !strcasecmp(tmp_value, "stderr")) {
+ mode = PHP_DISPLAY_ERRORS_STDERR;
+ } else if (tmp_value_len == 6 && !strcasecmp(tmp_value, "stdout")) {
+ mode = PHP_DISPLAY_ERRORS_STDOUT;
+ } else {
+ mode = atoi(tmp_value);
+ if (mode && (mode != PHP_DISPLAY_ERRORS_STDOUT || mode != PHP_DISPLAY_ERRORS_STDERR)) {
+ mode = PHP_DISPLAY_ERRORS_STDOUT;
+ }
+ }
+
+ switch (mode) {
+ case PHP_DISPLAY_ERRORS_STDERR:
+ PUTS("STDERR");
+ break;
+
+ case PHP_DISPLAY_ERRORS_STDOUT:
+ PUTS("STDOUT");
+ break;
+
+ default:
+ PUTS("Off");
+ break;
+ }
+}
+/* }}} */
+
/* Need to convert to strings and make use of:
* PHP_SAFE_MODE
*
@@ -246,7 +324,7 @@
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 +887,14 @@
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: main/php_globals.h
===================================================================
RCS file: /repository/php-src/main/php_globals.h,v
retrieving revision 1.98.2.1.2.6
diff -u -r1.98.2.1.2.6 php_globals.h
--- main/php_globals.h 9 Jul 2007 17:27:23 -0000 1.98.2.1.2.6
+++ main/php_globals.h 18 Jul 2007 15:05:47 -0000
@@ -33,7 +33,11 @@
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
@@ -77,7 +81,7 @@
long max_input_time;
zend_bool track_errors;
- zend_bool display_errors;
+ long display_errors;
zend_bool display_startup_errors;
zend_bool log_errors;
long log_errors_max_len;
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php