# PHP生产环境错误处理:隐藏错误并记录日志
在PHP生产环境中,错误处理是保证系统稳定性和安全性的关键环节。本文将详细介绍如何在生产环境中合理配置PHP错误处理机制,既隐藏错误信息避免暴露敏感数据,又能完整记录错误日志便于排查问题。
## 一、生产环境与开发环境的区别
在开发环境中,我们希望看到所有错误信息以便调试:
```php
error_reporting(E_ALL);
ini_set('display_errors', 1);
```
但在生产环境中,这样的配置会带来安全隐患:
1. 暴露服务器路径、数据库连接信息等敏感数据
2. 向用户展示不友好的技术细节
3. 可能泄露系统架构信息
## 二、生产环境推荐配置
```php
// 关闭错误显示
ini_set('display_errors', 0);
// 开启错误日志记录
ini_set('log_errors', 1);
// 设置错误日志路径
ini_set('error_log', '/path/to/php_errors.log');
// 报告所有错误(但不显示)
error_reporting(E_ALL);
```
## 三、php.ini推荐配置
在php.ini文件中,建议设置以下参数:
```
display_errors = Off
log_errors = On
error_log = /var/log/php_errors.log
error_reporting = E_ALL
```
## 四、自定义错误处理函数
对于更高级的错误处理,可以注册自定义错误处理器:
```php
set_error_handler(function($errno, $errstr, $errfile, $errline) {
// 格式化错误信息
$message = sprintf(
"[%s] 错误(%d): %s 在 %s 的第 %d 行",
date('Y-m-d H:i:s'),
$errno,
$errstr,
$errfile,
$errline
);
// 写入错误日志
error_log($message);
// 对用户显示友好错误页面
if (!headers_sent()) {
header("HTTP/1.1 500 Internal Server Error");
include 'errors/500.html';
}
// 返回true表示已处理错误,阻止PHP默认错误处理
return true;
});
// 致命错误捕获
register_shutdown_function(function() {
$error = error_get_last();
if ($error && in_array($error['type'], [E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR])) {
// 处理致命错误
error_log("致命错误: " . print_r($error, true));
if (!headers_sent()) {
header("HTTP/1.1 500 Internal Server Error");
include 'errors/500.html';
}
}
});
```
## 五、日志记录最佳实践
1. **日志分级**:区分不同级别的错误(DEBUG, INFO, WARNING, ERROR, CRITICAL)
2. **日志轮转**:防止单个日志文件过大
3. **敏感信息过滤**:过滤密码、密钥等敏感信息
4. **结构化日志**:使用JSON格式便于后续分析
```php
function log_error($level, $message, $context = []) {
$entry = [
'timestamp' => date('c'),
'level' => $level,
'message' => $message,
'context' => $context,
'request' => [
'method' => $_SERVER['REQUEST_METHOD'] ?? '',
'uri' => $_SERVER['REQUEST_URI'] ?? '',
'ip' => $_SERVER['REMOTE_ADDR'] ?? ''
]
];
file_put_contents(
'/var/log/php_app.log',
json_encode($entry) . PHP_EOL,
FILE_APPEND
);
}
```
## 六、监控与告警
在生产环境中,仅仅记录日志是不够的,建议:
1. 使用工具如Sentry、Bugsnag等实时监控错误
2. 设置日志分析系统(ELK Stack)
3. 对关键错误设置邮件/SMS告警
4. 定期审查错误日志,识别高频错误
## 七、常见问题与解决方案
**Q:如何知道错误日志是否正常工作?**
A:可以手动触发一个错误测试:
```php
trigger_error("这是一个测试错误", E_USER_NOTICE);
```
**Q:日志文件权限问题怎么办?**
A:确保PHP进程有写入权限,通常需要:
```bash
chown www-data:www-data /var/log/php_errors.log
chmod 664 /var/log/php_errors.log
```
**Q:如何避免日志文件过大?**
A:使用logrotate工具定期轮转日志:
```
/var/log/php_errors.log {
weekly
missingok
rotate 12
compress
delaycompress
notifempty
create 664 www-data www-data
}
```
## 结语
合理的错误处理机制是生产环境PHP应用稳定运行的保障。通过隐藏错误显示、完善日志记录、建立监控告警系统,可以大大提高系统的可靠性和安全性。建议定期审核错误处理策略,确保其符合业务需求和安全标准。