当我们的站点遇到内部服务器错误时,我正在尝试收集信息。我们有许多应用程序从未设置过正确的错误日志记录,当问题发生时,我们的客户不会为我们提供最好的信息。我想做的是,当 500 发生时,我想收集有关问题发生位置的数据,例如:
- 用户所在的页面
- 与页面相关的任何数据($_GET、$_POST 等)
我已经使用以下配置在我们的服务器 (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 和 $_GET 进行 var_dump 以查看其中是否有任何内容进入错误页面,但事实并非如此。我对 500 错误的目标是:
- 在出错时收集有关页面/用户的数据
- 向支持团队发送有关包含所收集数据的问题的电子邮件
有什么方法可以收集该数据并让自定义错误页面看到它吗?
错误.php:
switch($ErrorCode){
case '500':
var_dump($_REQUEST, $_POST, $_GET);
echo "internal server error";
break;
}
在所有情况下 $_POST 都是空的,即使我提交了一个表单来得到这个错误并且 $_GET 包含这个(这是有道理的):
array(2) {
["code"]=>
string(3) "500"
["500;http://icom-sbs/test_php"]=>
string(0) ""
}
4/19更新
我尝试了一些想法,主要的想法是将有用的数据存储在 session 变量中。我试图将一些表单数据存储在出现错误的测试页上的 session 变量中,但它永远不会进入 session 。看起来服务器检测到页面上会发生错误,所以它甚至没有在页面上执行任何代码并立即执行错误页面。
最佳答案
如果您的服务器开始解释 php 文件并且在发生此 500 错误之后,这意味着您的代码中发生了一些 fatal error 。它可能是任何东西,从简单的错字到达到的执行时间限制。
在 PHP 中捕获 fatal error 的最好也是唯一的方法是使用 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
}
这是我从示例中得到的 handle_fatal:
[FATAL] Class 'Dupa' not found in /var/www/index.php:22
GET:
Array ( [page] => dupa )
POST:
Array ( [subpage] => 1 )
毕竟你应该知道捕捉这样的错误是not always best idea你应该小心。
关于php - 获取有关 500 错误的表单数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16086774/