<span>
</span>
<span>
require
</span>
'errorHandlerException.class.php'
;<span>
<span>
class
</span><span> errorHandler
{
</span><span>
public
</span> <span>
$argvs
</span> = <span>
array
</span><span>();
</span><span>
public
</span> <span>
$memoryReserveSize
</span> = 262144;<span>
<span>
private
</span> <span>
$_memoryReserve
</span>;<span>
<span>
</span>
<span>
public
</span> <span>
function
</span><span> register()
{
</span><span>
ini_set
</span>(
'display_errors'
, 0<span>);
</span><span>set_exception_handler</span>(<span>
array
</span>(<span>
$this
</span>,
'handleException'
));<span>
<span>set_error_handler</span>(<span>
array
</span>(<span>
$this
</span>,
'handleError'
));<span>
<span>
$this
</span>->memoryReserveSize > 0 && <span>
$this
</span>->_memoryReserve = <span>
str_repeat
</span>(
'x'
, <span>
$this
</span>-><span>memoryReserveSize);
</span><span>register_shutdown_function</span>(<span>
array
</span>(<span>
$this
</span>,
'handleFatalError'
));<span>
<span> }
</span><span>
</span>
<span>
public
</span> <span>
function
</span><span> unregister()
{
</span><span>restore_error_handler</span><span>();
</span><span>restore_exception_handler</span><span>();
}
</span><span>
</span>
<span>
public
</span> <span>
function
</span> handleException(<span>
$exception
</span><span>)
{
</span><span>
$this
</span>-><span>unregister();
</span><span>
try
</span><span>
{
</span><span>
$this
</span>->logException(<span>
$exception
</span><span>);
</span><span>
exit
</span>(1<span>);
}
</span><span>
catch
</span>(<span>Exception</span> <span>
$e
</span><span>)
{
</span><span>
exit
</span>(1<span>);
}
}
</span><span>
</span>
<span>
public
</span> <span>
function
</span> handleError(<span>
$code
</span>, <span>
$message
</span>, <span>
$file
</span>, <span>
$line
</span><span>)
{
</span><span>
<span>
if
</span>((<span>
error_reporting
</span>() & <span>
$code
</span>) && !<span>in_array</span>(<span>
$code
</span>, <span>
array
</span>(<span>E_NOTICE</span>, <span>E_WARNING</span>, <span>E_USER_NOTICE</span>, <span>E_USER_WARNING</span>,<span> E_DEPRECATED)))
{</span><span>
<span>
$exception
</span> = <span>
new
</span> errorHandlerException(<span>
$message
</span>, <span>
$code
</span>, <span>
$code
</span>, <span>
$file
</span>, <span>
$line
</span><span>);
</span><span>
$trace
</span> = <span>debug_backtrace</span><span>(DEBUG_BACKTRACE_IGNORE_ARGS);
</span><span>
array_shift
</span>(<span>
$trace
</span>);<span>
<span>
foreach
</span>(<span>
$trace
</span> <span>
as
</span> <span>
$frame
</span><span>)
{
</span><span>
if
</span>(<span>
$frame
</span>[
'function'
] ==
'__toString'
<span>)
{</span><span>
<span>
$this
</span>->handleException(<span>
$exception
</span><span>);
</span><span>
exit
</span>(1<span>);
}
}
</span><span>
throw
</span> <span>
$exception
</span><span>;
}
</span><span>
return
</span> <span>false</span><span>;
}
</span><span>
</span>
<span>
public
</span> <span>
function
</span><span> handleFatalError()
{
</span><span>unset</span>(<span>
$this
</span>->_memoryReserve);<span>
<span>
$error
</span> = error_get_last();<span>
<span>
if
</span>(errorHandlerException::isFatalError(<span>
$error
</span><span>))
{</span><span>
<span>
$exception
</span> = <span>
new
</span> errorHandlerException(<span>
$error
</span>[
'message'
], <span>
$error
</span>[
'type'
], <span>
$error
</span>[
'type'
], <span>
$error
</span>[
'file'
], <span>
$error
</span>[
'line'
<span>]);
</span><span>
$this
</span>->logException(<span>
$exception
</span><span>);
</span><span>
exit
</span>(1<span>);
}
}
</span><span>
</span>
<span>
final
</span> <span>
public
</span> <span>
function
</span><span> getServerIp()
{
</span><span>
$serverIp
</span> =
''
<span>;
</span><span>
if
</span>(<span>isset</span>(<span>
$_SERVER
</span>[
'SERVER_ADDR'
<span>]))
{
</span><span>
$serverIp
</span> = <span>
$_SERVER
</span>[
'SERVER_ADDR'
<span>];
}
</span><span>
elseif
</span>(<span>isset</span>(<span>
$_SERVER
</span>[
'LOCAL_ADDR'
<span>]))
{
</span><span>
$serverIp
</span> = <span>
$_SERVER
</span>[
'LOCAL_ADDR'
<span>];
}
</span><span>
elseif
</span>(<span>isset</span>(<span>
$_SERVER
</span>[
'HOSTNAME'
<span>]))
{
</span><span>
$serverIp
</span> = <span>
gethostbyname
</span>(<span>
$_SERVER
</span>[
'HOSTNAME'
<span>]);
}
</span><span>
else
</span><span>
{
</span><span>
$serverIp
</span> = <span>
getenv
</span>(
'SERVER_ADDR'
<span>);
}
</span><span>
return
</span> <span>
$serverIp
</span><span>;
}
</span><span>
</span>
<span>
public
</span> <span>
function
</span><span> getCurrentUri()
{
</span><span>
$uri
</span> =
''
<span>;
</span><span>
if
</span>(<span>
$_SERVER
</span> [
"REMOTE_ADDR"
<span>])
{</span><span>
<span>
$uri
</span> =
'http://'
. <span>
$_SERVER
</span>[
'SERVER_NAME'
] . <span>
$_SERVER
</span>[
'REQUEST_URI'
<span>];
}
</span><span>
else
</span><span>
{</span><span>
<span>
$params
</span> = <span>
$this
</span>-><span>argvs;
</span><span>
$uri
</span> = <span>
$params
</span>[0<span>];
</span><span>
array_shift
</span>(<span>
$params
</span><span>);
</span><span>
for
</span>(<span>
$i
</span> = 0, <span>
$len
</span> = <span>
count
</span>(<span>
$params
</span>); <span>
$i
</span> < <span>
$len
</span>; <span>
$i
</span>++<span>)
{
</span><span>
$uri
</span> .=
' '
. <span>
$params
</span>[<span>
$i
</span><span>];
}
}
</span><span>
return
</span> <span>
$uri
</span><span>;
}
</span><span>
</span>
<span>
final
</span> <span>
public
</span> <span>
function
</span> logException(<span>
$e
</span><span>)
{
</span><span>
$error
</span> = <span>
array
</span><span>(
</span>
'add_time'
=> <span>time</span>(),
'title'
=> errorHandlerException::getName(<span>
$e
</span>->getCode()),<span>
'message'
=> <span>
array
</span>(),
'server_ip'
=> <span>
$this
</span>->getServerIp(),
'code'
=> errorHandlerException::getLocalCode(<span>
$e
</span>->getCode()),<span>
'file'
=> <span>
$e
</span>->getFile(),
'line'
=> <span>
$e
</span>->getLine(),
'url'
=> <span>
$this
</span>->getCurrentUri(),<span>
);
</span><span>
do
</span><span>
{
</span><span>
<span>
$message
</span> = (<span>string</span>)<span>
$e
</span><span>;
</span><span>
$error
</span>[
'message'
][] = <span>
$message
</span><span>;
} </span><span>
while
</span>(<span>
$e
</span> = <span>
$e
</span>-><span>getPrevious());
</span><span>
$error
</span>[
'message'
] = <span>implode</span>(
"\r\n"
, <span>
$error
</span>[
'message'
<span>]);
</span><span>
$this
</span>->logError(<span>
$error
</span><span>);
}
</span><span>
</span>
<span>
public
</span> <span>
function
</span> logError(<span>
$error
</span><span>)
{
</span><span>
</span><span>
}
}</span>