我有一个脚本,每天在服务器上运行,从没有HTML输出的资源下载数据。默认情况下,PHP会将我的脚本错误输出到php_error.log
并输出到NetBeans中的输出窗口。
我创建了一个用户错误处理程序:
// user defined error handling function
function userErrorHandler($errno, $errmsg, $filename, $linenum, $vars)
{
error_log($errmsg, 3, "logs/aem.log");
switch ($errno) {
case E_ERROR:
exit("Error grave $errmsg at $filename:$linenum");
break;
case E_USER_ERROR:
exit("Error grave $errmsg at $filename:$linenum");
break;
}
}
error_reporting(0);
set_error_handler('userErrorHandler');
我将此文件包含在我的主脚本中,一切正常。
在我开发应用程序时,我想继续在Netbeans的输出屏幕上看到错误消息以及保留错误日志文件(作为默认处理程序)。我尝试更改error_reporting
的值或添加其他error_log函数,尝试以下值:
error_reporting(E_ALL | E_STRICT);
error_reporting(-1);
error_log($errmsg, 0);`
但是除非我从文件中删除include('mycustomhandler');
,否则我从未在输出中收到错误。
如何模拟标准错误处理程序的行为?
答案 0 :(得分:1)
您应该尝试使用输出stderr
(我猜netbeans会解析它)。例如:
fprintf( STDERR, "Normal error message %s\n", "With nested info");
对于记录错误,您可以使用error_log()
(也可能会处理netbeans的输出)或尝试从php.ini
(error_log
)解析ini_get()
。
但是我猜php使用internaly syslog()
。因此,您的错误处理程序应如下所示:
// Logging
function userErrorHandler($errno, $errmsg, $filename, $linenum, $vars){
$logLevel = 0;
$label = '';
$exit = false;
switch( $errno){
case E_ERROR:
case E_USER_ERROR:
$label = 'Critical error';
$exit = true;
$logLevel = LOG_ERR;
break;
// ...
}
$message = "$label: on line ... file, error string...";
if( $logLevel){
syslog( $logLevel, $message);
}
if( !ini_get( 'display_error') && $exit){
die( 'Fatal error occured.');
}
if( $label){
echo $message; // You're responsible for how error is displayed
}
if( $exit){
die();
}
}
error_reporting( E_ALL);
如果我没有达到您的要求,请在评论中提问