set_error_handler() only triggering every Nth time

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



I am implementing a custom error handler and started noticing some bizarre
behavior. Every Nth time I refresh the page, I see the error/output.

In my 'includes/common.inc.php' the key things are these:

	set_error_handler('php_error_handler');

	function php_error_handler($errno, $errstr, ...)
	{
	   //does some stuff
	   //calls php_custom_error_log()
	}

	function php_custom_error_log()
	{
		echo "php_custom_error_log : ".date('H:i:s');
	
		if ($error = error_get_last())
		{
			var_dump(LOG_LEVEL, $error);
	
		//does more stuff
	}

My test page:

	<?php
	define('LOG_LEVEL', E_ALL ^ E_NOTICE);
	error_reporting(LOG_LEVEL);
	ini_set('display_errors','On');
	
	define('VM', true);
	define('DEVELOPMENT', false);
	
	ini_set('xdebug.var_display_max_children', 1000 ); 
	ini_set('xdebug.var_display_max_depth', 5 ); 
	
	require_once 'includes/common.inc.php';
	
	###### BEGIN TEST #########
	
	foreach($empty as $k) echo $k;
	?>

For those astute observers, you'll note that $empty is not an array and
therefore I expect an error message (well warning)

( ! ) Warning: Invalid argument supplied for foreach() in
/usr/home/vz/examples.videosz.com/error_handler_tests.php on line 20
Call Stack
#	Time	Memory	Function	Location
1	0.0005	663616	{main}( )	../error_handler_tests.php:0

As I simply click 'refresh' on the browser I noticed that it was only
periodically working. I then deduced that it was directly related to the
number of apache threads. So if I had 15 then it would work every 15th
refresh:

developer@vm:/usr/local/etc/apache22$ ps aux | grep httpd
(standard input):39:root      15855  0.0  2.0 204156 20292  ??  Ss   28Feb12
1:33.48 /usr/local/sbin/httpd -k start
(standard input):48:www       89522  0.0  2.0 204156 20332  ??  I     8:03PM
0:00.01 /usr/local/sbin/httpd -k start
(standard input):49:www       89523  0.0  2.0 204156 20332  ??  I     8:03PM
0:00.01 /usr/local/sbin/httpd -k start
(standard input):50:www       89524  0.0  2.0 204156 20332  ??  I     8:03PM
0:00.01 /usr/local/sbin/httpd -k start
(standard input):51:www       89525  0.0  2.0 204156 20332  ??  I     8:03PM
0:00.01 /usr/local/sbin/httpd -k start
(standard input):52:www       89527  0.0  2.0 204156 20332  ??  I     8:03PM
0:00.01 /usr/local/sbin/httpd -k start
(standard input):53:www       89528  0.0  2.0 204156 20332  ??  I     8:03PM
0:00.01 /usr/local/sbin/httpd -k start
(standard input):54:www       89529  0.0  2.0 204156 20332  ??  I     8:03PM
0:00.01 /usr/local/sbin/httpd -k start
(standard input):55:www       89530  0.0  2.0 204156 20332  ??  I     8:03PM
0:00.01 /usr/local/sbin/httpd -k start
(standard input):56:www       89531  0.0  2.0 204156 20332  ??  I     8:03PM
0:00.01 /usr/local/sbin/httpd -k start
(standard input):57:www       89532  0.0  2.0 204156 20332  ??  I     8:03PM
0:00.01 /usr/local/sbin/httpd -k start
(standard input):58:www       89533  0.0  2.0 204156 20332  ??  I     8:03PM
0:00.01 /usr/local/sbin/httpd -k start
(standard input):59:www       89534  0.0  2.0 204156 20332  ??  I     8:03PM
0:00.01 /usr/local/sbin/httpd -k start
(standard input):60:www       89535  0.0  2.0 204156 20332  ??  I     8:03PM
0:00.01 /usr/local/sbin/httpd -k start
(standard input):61:www       89563  0.0  2.1 206204 21700  ??  I     8:17PM
0:00.10 /usr/local/sbin/httpd -k start
(standard input):62:www       89578  0.0  2.0 204156 20332  ??  I     8:22PM
0:00.01 /usr/local/sbin/httpd -k start
(standard input):74:developer 89587  0.0  0.1  9092  1196   1  S+    8:30PM
0:00.01 grep -inH --color httpd
 

124 <IfModule prefork.c>
125 StartServers      15
126 MinSpareServers   15
127 MaxSpareServers   20
128 ServerLimit       50
129 MaxClients        50
130 MaxRequestsPerChild  15
131 KeepAlive         Off
132 </IfModule>

Just to check and the time is updating each press and every 15th try I'd get
this:

php_custom_error_log : 19:54:20
int 30711
array
  'type' => int 8192
  'message' => string 'Directive 'register_globals' is deprecated in PHP 5.3
and greater' (length=65)
  'file' => string 'Unknown' (length=7)
  'line' => int 0

When I'd expect to see a message every time (with a new timestamp).

Then I REALLY looked at the 'message' part. "register_globals". WTF? That
isn't the error I expected.

Hmmm.. what happens if I move the second function inline to the first...

BAM! EVERY TIME it works perfectly.

So WTFF??! Why does moving it inline make any difference? All I suspect is
the $error = error_get_last() part. For some reason that isn't consistent.
And the other strange thing is that it's giving me erroneous error messages
(well, we do have register_globals on, but that's not the error I was
expecting).

Then I did another test replacing the foreach() with this statement:

	require_once "/foo.inc.php";

A few bizarre things about this too. For starters why do I get TWO error
messages. One WARNING from MY error handler and then a FATAL default PHP
one?! Sorta defeats my purpose.

	WARNING: require_once(/foo.inc.php) [function.require-once]:
		 failed to open stream: No such file or directory in
		 /usr/home/vz/examples.com/error_handler_tests.php on line
22

	Fatal error: require_once() [function.require]:
		 Failed opening required '/foo.inc.php'
(include_path='.:/home/SHARED')
		 in /usr/home/examples. com/error_handler_tests.php on line
22

Next if I print out php_error_handler($errno, ...) it says "2". And '2' is a
WARNING according to this page:
http://php.net/manual/en/errorfunc.constants.php Shouldn't it be "1"!?

developer@vm_daevid:/usr/local/etc/apache22$ php --version
PHP 5.3.6 with Suhosin-Patch (cli) (built: Apr 28 2011 14:20:48)
Copyright (c) 1997-2011 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies
    with Xdebug v2.0.5, Copyright (c) 2002-2008, by Derick Rethans

Running on FreeBSD.


-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux