我的下载脚本中出现间歇性错误,我无法通过try / catch或任何可靠性重现。渲染时,我的500内部错误页面会向我的系统记录它发生的情况。这是似乎抛出错误的代码块(如下面的日志所示)。
$logger->addDebug("User downloading widget", $dl);
header('Content-Description: File Transfer');
header('Content-type: application/octet-stream');
header('Content-length: '.filesize($dl['url']));
header('Content-Disposition: attachment; filename="'.str_replace('"', '_', $dl['name']).'"');
readfile($dl['url']);
exit();
围绕它的try/catch
块:
} catch (Exception $e) {
$logger->addCritical('DOWNLOAD ERROR ENCOUNTERED', array (
errorMessage => $e->getMessage()
));
我的日志显示以下内容。注意第二个日志是我的500.php中的一个日志,而不是那里的catch块中的日志。
[2015-09-27 13:21:15] Site DEBUG: User downloading widget { ... }
[2015-09-27 13:21:16] Site CRITICAL: 500 INTERNAL SERVER ERROR { ... }
Apache / PHP也配置为记录错误,但在那些匹配任何事件的日志中没有相关错误。
$dl['url']
是磁盘上存在的有效文件位置。 $dl['name']
是一个严格控制的文件名值,仅存在且仅为字母数字(替换只是一种安全措施)。使用浏览器中的确切URL(以及触及此代码块的情况)我没有收到错误。
我把它包装在try / catch块中,它只是尝试记录错误,但是没有得到任何日志结果,即使我仍然得到500错误日志。所以现在我认为我需要一种更通用的方法来解决这个错误。 有没有办法在500错误页面(如.htaccess中设置)来获取触发页面的服务器错误?或者,或者,有一个原因是为什么尝试/捕获块(简单来说)会记录错误)不起作用吗?
答案 0 :(得分:0)
您无法捕获异常,因为没有异常。只是一个错误。
500错误页面没有任何有关导致其显示的错误的信息。但是有多种方法可以显示或记录错误:
如果它不是生产网站,那么只需在输出中启用显示错误。您可以在php.ini
,.htaccess
或PHP脚本中执行此操作。搜索error_reporting
和display_errors
。
如果是生产网站,则不应向用户显示错误,因此启用错误记录。这些设置搜索log_errors
和error_log
。这些设置也可以在php.ini
,.htaccess
或PHOP脚本中设置。我建议您在php.ini
或.htaccess
。
您可以实现并设置custom error handler ,这只是一个回调函数,只要发生PHP错误就会调用它。在此功能中,您可以获得有关错误(文件,行,消息,错误编号等)的所有信息,您可以在那里做任何您想做的事情。因此,您可以实现自定义错误记录。
注意:如果您通过调用函数在PHP脚本中设置了这些设置中的任何一个,并且脚本中的某处存在语法错误,那么它实际上无法解析和执行,这些功能不会被执行,也不会设置错误报告或记录。因此最好在php.ini
或.htaccess
中进行配置。