php - 获取有关500错误的表单数据

原文 标签 php iis internal-server-error

当我们的站点遇到内部服务器错误时,我试图收集信息。我们有许多应用程序从来没有设置正确的错误日志记录,当出现问题时,我们的客户不会给我们最好的信息。我想做的是,当发生500个问题时,我想收集有关问题发生位置的数据,例如:
用户所在的页面
与页面关联的任何数据($获取、$发布等)
我已使用以下配置在服务器(IIS 7)上设置自定义错误页:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <httpErrors errorMode="Custom">
            <remove statusCode="500" />
            <error statusCode="500" path="/error.php?code=500" responseMode="ExecuteURL" />
        </httpErrors>
    </system.webServer>
</configuration>

在那一页上,我只是在转储$post和$中的任何内容,看看它们是否能进入错误页,但没有。我的500个错误的目标是:
在出错时收集有关页/用户的数据
向支持团队发送有关包含所收集数据的问题的电子邮件
有什么方法可以收集这些数据并让自定义错误页看到它吗?
错误:PHP:
switch($ErrorCode){
    case '500':
         var_dump($_REQUEST, $_POST, $_GET);
         echo "internal server error";
         break;
}

在所有情况下,$u post都是空的,即使我提交了一个表单以获取此错误,并且$u get包含此内容(这是有意义的):
array(2) {
  ["code"]=>
  string(3) "500"
  ["500;http://icom-sbs/test_php"]=>
  string(0) ""
}

4/19更新
我提出了一些想法,其中最主要的是将有用的数据存储在会话变量中。我试图将一些表单数据存储在测试页上的会话变量中,该变量会产生错误,但它从未进入会话。服务器似乎检测到页面上会发生错误,因此它甚至从不执行页面上的任何代码,而是立即执行错误页面。

最佳答案

如果您的服务器开始解释php文件,在这500个错误发生后,这意味着在您的代码中发生了一些致命的错误。它可能是任何东西,从简单的输入错误到达到执行时间限制。
在php中捕获致命错误的最好也是唯一的方法是使用register_shutdown_function。您应该在工作文件的顶部定义它:

function handle_fatal() {
    $error = error_get_last(); // PHP 5.2+
    if($error !== NULL){
        $error_landing_page = '[FATAL] '.$error['message'].' in '.$error['file'].':'.$error['line'] . '<br/>GET:<br/>' . print_r($_GET, true) . '<br/>POST:<br/>' . print_r($_POST, true);
        // mail here if you need that and include $_GET, $_POST variables - this will be the last state before error occurred
        exit($error_landing_page);
    }
}

register_shutdown_function('handle_fatal');

简单测试用例:
// put handling function at the very beginning
function handle_fatal() {/*...*/}
register_shutdown_function('handle_fatal');

// now do some logic
if($_GET['page'] == 'dupa'){
    $_POST['subpage'] = 1; // more and more logic
    $obj = new Dupa(); // class not found exception
}

这就是我用我的手柄得到的结果,例如:
[FATAL] Class 'Dupa' not found in /var/www/index.php:22
GET:
Array ( [page] => dupa )
POST:
Array ( [subpage] => 1 ) 

毕竟,你应该知道捕捉这样的错误是not always best idea的,你应该小心。

相关文章:

php - 无法重新声明函数php [重复]

php - MySQL,PHP:更新前检查竞态条件

php - 一段时间后取消设置会话

windows - 在IIS下运行SVN存储库

c# - 为什么ServicePointManager.SecurityProtocol的默认值在不同的计算机上不同?

javascript - jQuery-AJAX POST请求给出了500个内部服务器错误

javascript - 提交的textarea keyup事件

php - PHP 5.4.11上PDO :: execute(array())的内部服务器错误

python - Scrapy Authenticated Spider获取内部服务器错误

html - IE8在IIS上不显示背景图像