ID:               38734
 Updated by:       [EMAIL PROTECTED]
 Reported By:      [EMAIL PROTECTED]
-Status:           Assigned
+Status:           Wont fix
 Bug Type:         Performance problem
 Operating System: n/a
 PHP Version:      5.2.0RC3
 Assigned To:      iliaa
 New Comment:

I've reviewed the code path and it appears we cannot skip 
error message allocation code. 


Previous Comments:
------------------------------------------------------------------------

[2006-09-06 18:15:59] [EMAIL PROTECTED]

Description:
------------
in the php_error_cb function the spprintf function is called as well as
other code to allocate an error message even if this error message is
never displayed due to logging levels or output settings.  (ie:
error_reporting = E_ALL | ~E_NOTICE would cause all E_NOTICE messages
to be allocated but not displayed).  This patch will short circuit the
function call in these cases...

Index: main/main.c
===================================================================
RCS file: /repository/php-src/main/main.c,v
retrieving revision 1.640.2.23.2.13
diff -u -r1.640.2.23.2.13 main.c
--- main/main.c 17 Aug 2006 13:43:08 -0000      1.640.2.23.2.13
+++ main/main.c 6 Sep 2006 18:07:35 -0000
@@ -657,6 +657,14 @@
        int buffer_len, display;
        TSRMLS_FETCH();
 
+    /* Only go through this code if we are going to do something worth
while... */
+    if ( PG(error_handling) == EH_NORMAL
+         && ( !(EG(error_reporting) & type) || !( PG(log_errors) ||
PG(display_errors) || (!module_initialized) ) )
+         && !( type & (E_ERROR | E_CORE | E_COMPILE_ERROR |
E_USER_ERROR | E_PARSE | E_RECOVERABLE_ERROR) )
+       ) {
+        return;
+    } 
+
        buffer_len = vspprintf(&buffer, PG(log_errors_max_len), format,
args);
 
        /* check for repeated errors to be ignored */


Reproduce code:
---------------
Set error_reporting to include E_NOTICE, use a test file like:

<?php echo $foo; // Produce E_NOTICE ?>



Expected result:
----------------
gdb trace shows the call into vpprintf...

Breakpoint 1, php_error_cb (type=8, error_filename=0x78def0
"/Users/shire/www/error.php", error_lineno=3, format=0x2443f8
"Undefined variable: %s", args=0xbfffec58 "??x") at
/Users/shire/data/phpcvs-5.2/main/main.c:661
661         if ( PG(error_handling) == EH_NORMAL
(gdb) n
668             buffer_len = vspprintf(&buffer, PG(log_errors_max_len),
format, args);


Actual result:
--------------
With the patch we skip this step when error_reporting does not include
E_NOTICE...

Breakpoint 1, php_error_cb (type=8, error_filename=0x78def0
"/Users/shire/www/error.php", error_lineno=3, format=0x2443f8
"Undefined variable: %s", args=0xbfffec58 "??x") at
/Users/shire/data/phpcvs-5.2/main/main.c:661
661         if ( PG(error_handling) == EH_NORMAL
(gdb) n
867     }
(gdb) n
zend_error (type=8, format=0x2443f8 "Undefined variable: %s") at
/Users/shire/data/phpcvs-5.2/Zend/zend.c:942
942             if (!EG(user_error_handler)



------------------------------------------------------------------------


-- 
Edit this bug report at http://bugs.php.net/?id=38734&edit=1

Reply via email to