Php 暂时禁用设置错误处理程序

Php 暂时禁用设置错误处理程序,php,error-handling,Php,Error Handling,我使用的是一个自定义错误处理程序,使用的是set\u error\u处理程序。所有的工作都很完美,直到我进入了做马车脚本的部分。这个有缺陷的脚本在某种程度上集成到了。请注意,我在没有集成的情况下启用了ostickets的基本安装上的所有错误,并且我得到了相同的错误,因此我知道这不是集成中的缺陷 当我运行下面所示的脚本时,我会将大约200个错误写入日志并通过电子邮件发送给我 我的愿望是在此脚本之前暂时禁用set_error_处理程序,然后在脚本完成后重新启用它 这是如何实现的 <?php

我使用的是一个自定义错误处理程序,使用的是set\u error\u处理程序。所有的工作都很完美,直到我进入了做马车脚本的部分。这个有缺陷的脚本在某种程度上集成到了。请注意,我在没有集成的情况下启用了ostickets的基本安装上的所有错误,并且我得到了相同的错误,因此我知道这不是集成中的缺陷

当我运行下面所示的脚本时,我会将大约200个错误写入日志并通过电子邮件发送给我

我的愿望是在此脚本之前暂时禁用set_error_处理程序,然后在脚本完成后重新启用它

这是如何实现的

<?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);