Php 暂时禁用设置错误处理程序
我使用的是一个自定义错误处理程序,使用的是set\u error\u处理程序。所有的工作都很完美,直到我进入了做马车脚本的部分。这个有缺陷的脚本在某种程度上集成到了。请注意,我在没有集成的情况下启用了ostickets的基本安装上的所有错误,并且我得到了相同的错误,因此我知道这不是集成中的缺陷 当我运行下面所示的脚本时,我会将大约200个错误写入日志并通过电子邮件发送给我 我的愿望是在此脚本之前暂时禁用set_error_处理程序,然后在脚本完成后重新启用它 这是如何实现的Php 暂时禁用设置错误处理程序,php,error-handling,Php,Error Handling,我使用的是一个自定义错误处理程序,使用的是set\u error\u处理程序。所有的工作都很完美,直到我进入了做马车脚本的部分。这个有缺陷的脚本在某种程度上集成到了。请注意,我在没有集成的情况下启用了ostickets的基本安装上的所有错误,并且我得到了相同的错误,因此我知道这不是集成中的缺陷 当我运行下面所示的脚本时,我会将大约200个错误写入日志并通过电子邮件发送给我 我的愿望是在此脚本之前暂时禁用set_error_处理程序,然后在脚本完成后重新启用它 这是如何实现的 <?php
<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
set_error_handler("my_error_handler");
//Do normal script
//I wish to disable set_error_handler here
//Do buggy script
//I wish to re-enable set_error_handler here
//Do normal script
//Complete
function my_error_handler($e_number, $e_message, $e_file, $e_line, $e_vars) {
$message = "An error occurred in script '$e_file' on line $e_line: $e_message (error no: $e_number)";
syslog(LOG_INFO,'my_error_handler: '.$message);
$e_vars='<pre>'.print_r($e_vars, 1).'</pre>';
ob_start();
debug_print_backtrace();
$backtrace = ob_get_clean();
if (in_array(substr($_SERVER['HTTP_HOST'], 0, 5), array('local', '127.0', '192.1'))) {
echo "<div class='error'>{$message}</div><p>e_vars:</p><pre>{$e_vars}</pre><p>debug_print_backtrace:</p><pre>{$backtrace}</pre>";
} else {
error_log ($message.' e_vars=> '.$e_vars, 1, 'errors@testsite.com');
if ( ($e_number != E_NOTICE) && ($e_number < 2048)) {
echo '<div class="error">A system error occurred. We apologize for the inconvenience.</div>';
}
}
}
?>
只需设置另一个“不做任何事情”功能:
将return true更改为return false以执行PHP内部错误处理程序。只需设置另一个不执行任何操作的函数:
将return true更改为return false以执行PHP内部错误处理程序。将error\u reporting设置为0,并在处理程序中测试error\u reporting为0。如果是这样,就返回false。仅供参考,当您使用@suppress时,php也是这样做的warnings@DarkBee谢谢你,布莱克比。在OSTicket代码中,错误报告是在我的原始文章末尾定义的,因此我不知道是否可以按照您的建议执行;错误报告0//这里有些糟糕的代码;报告$old时出错;但是这不会被我在文章末尾展示的OSTicket脚本覆盖吗?我不确定我是否会跟随。这将暂时禁用错误报告,并在重置时重置为$old级别。因此,在运行错误脚本之前,错误报告将保留该值。我假设osticket代码是在脚本开始时执行的,因此$old将保存itSet error_reporting设置为0的值,并且在处理程序中测试error_reporting为0。如果是这样,就返回false。仅供参考,当您使用@suppress时,php也是这样做的warnings@DarkBee谢谢你,布莱克比。在OSTicket代码中,错误报告是在我的原始文章末尾定义的,因此我不知道是否可以按照您的建议执行;错误报告0//这里有些糟糕的代码;报告$old时出错;但是这不会被我在文章末尾展示的OSTicket脚本覆盖吗?我不确定我是否会跟随。这将暂时禁用错误报告,并在重置时重置为$old级别。因此,在运行错误脚本之前,错误报告将保留该值。我假设osticket代码是在脚本开始时执行的,因此$old将保存它设置的任何值
#Error reporting...Good idea to ENABLE error reporting to a file. i.e display_errors should be set to false
$error_reporting = E_ALL & ~E_NOTICE;
if (defined('E_STRICT')) # 5.4.0
$error_reporting &= ~E_STRICT;
if (defined('E_DEPRECATED')) # 5.3.0
$error_reporting &= ~(E_DEPRECATED | E_USER_DEPRECATED);
error_reporting($error_reporting); //Respect whatever is set in php.ini (sysadmin knows better??)
#Don't display errors
ini_set('display_errors', 0);
ini_set('display_startup_errors', 0);
$my_error_handler = set_error_handler(function() { return true; });
// call OSTicket here
set_error_handler($my_error_handler);