在PHP错误日志中包含$_POST, $_GET, $_SERVER值


Include $_POST, $_GET, $_SERVER values in PHP Error Log

我有这样的代码

try {
    header("Location: http://www.google.com'n-abc");
}
catch (Exception $e) {
    error_log(print_r($_POST, true));
    error_log(print_r($_GET, true));
    error_log(print_r($_SERVER, true));
}

没有try {} catch{}块,我可以看到POST, GET和SERVER变量在我的error_log,但与try {} catch{}块,我只看到默认的PHP错误。

  1. 是否有一种方法来显示POST, GET,和服务器变量在一个try {} catch{}块?
  2. 是否有一种方法让PHP包括POST, GET和服务器变量的所有错误得到记录到文件,而不仅仅是在我添加error_log(print_r($_POST, true));....?

try/catch一般用于想要抛出异常以防止PHP致命错误终止页面或使调试更容易的情况。下面是使用try/catch的方法:

try {
    if($a === true)
    {
        header("Location: http://www.google.com'n-abc");
    }
    else
    {
        throw new Exception('$a was not true');
    }
}
catch (Exception $e) {
    error_log(print_r($_POST, true));
    error_log(print_r($_GET, true));
    error_log(print_r($_SERVER, true));
    echo $e->getMessage(); // $a was not true
}

你没有在catch块中看到错误日志的原因是因为你从来没有抛出异常,所以PHP永远不会在catch块中查看你的变量日志。

如果你只是想让你的例子工作,你只需抛出一个异常,让PHP在catch块:

try 
{
    throw new Exception('redirecting...');
}
catch (Exception $e) 
{
    error_log(print_r($_POST, true));
    error_log(print_r($_GET, true));
    error_log(print_r($_SERVER, true));
    header("Location: http://www.google.com'n-abc");
}

这太愚蠢了:)

但是默认的PHP函数如header不会抛出异常。

如果你想让它们抛出异常,你需要设置错误处理程序使用ErrorException:

function exception_error_handler($errno, $errstr, $errfile, $errline ) {
    throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
}
set_error_handler("exception_error_handler");

我想你这里有一些问题。

首先,try/catch块用于异常。catch{}代码只在抛出指定类型的Exception时执行。

第二,header()函数不会抛出异常。相反,它只是直接生成一个PHP错误。

第三,要记录所有错误的变量,请查看set_error_handler(),它也应该处理上述第二个问题。

try/catch仅在使用实际抛出异常的对象时才有效。header()不是一个对象,永远不会抛出异常。就像我在回答这个问题的上一个版本时所说的,您需要设置一个自定义错误处理程序。

这就是try/catch应该如何工作的:当在try块中抛出异常时(并且仅在这种情况下),catch块执行。

header()函数可能会生成警告如果头已经发送,但它永远不会抛出异常。

回答你的问题:

  1. 你的catch块很好,但你需要的代码实际上可以抛出异常(通常是面向对象的代码,但不一定)。然而,如果你使用set_error_handler()创建一个自定义错误处理程序,并在其中使用throw,你可以配置PHP将常规错误转换为异常。

  2. 同上:set_error_handler()和set_exception_handler()

听起来您希望在抛出错误时向日志输出一些额外的信息。您应该查看PHP中的自定义错误处理。您可以在脚本中定义特定的方法来处理错误,并添加默认情况下不存在的功能。