我有一个非常有问题的问题,我想知道是否有人为我提供了一个很好的解决方案:
我正在记录日志文件中的每个可能错误。 包括异常,致命错误,警告,通知,JS错误(通过Ajax发送),......
现在,出于调试目的,我想在HTML页面上显示所有这些错误(所以我不需要检查日志文件)。
出于这个原因,我将每个新错误存储在Session-Variable中。当用户看到它时,它就会从会话中删除。
我的问题:
错误/异常的php-backtrace包含大量信息。包括全局变量,如$ _SESSION。
由于我将所有信息存储在会话中,因此会话大小在每次错误后都会翻倍。 (会话中的每条错误消息都包含此错误之前的会话的全部内容)
例如:
没有错误:
$_SESSION = array();
第一个错误:
$_SESSION = array(error1=>array("msg"="foo", session=array()));
第二个错误:
$_SESSION = array(error1=>array("msg"="foo", session=array()), error2 => array("msg"="foo2", session = array(error1=>array("msg"="foo", session=array()))));
(这只是一个简化的例子)
在5次错误之后,会话已经很大了,我无法再从本地服务器加载它(超时)。
我考虑过在5或者深度之后从数组中切割出每个元素。像那样。 或者是否可以阻止php在回溯中存储全局变量?
目前,我没有在会话中存储跟踪,但也许有人知道更好的解决方案,我仍然可以看到基本的跟踪信息
答案 0 :(得分:1)
如果我理解正确,那么您要做的就是拥有某种每会话错误日志,稍后可以阅读。
我的建议是每个会话创建单独的日志文件,您可以使用会话ID识别日志文件,每个会话都是唯一的。
<?php
define('PER_SESSION_LOG_PATH', '/tmp/logs/'); //or whatever path
/* return log handle */
class SessionLogger {
static $fh;
static function log_path() {
return PER_SESSION_LOG_PATH . session_id() . '.log';
}
static function log_open() {
if (!self::$fh) {
self::$fh = fopen(self::log_path(), 'a+');
}
return self::$fh;
}
static function add_log($errors) {
if (self::log_open()) {
fwrite(self::$fh, serialize($errors) . PHP_EOL);
}
}
static function log_close() {
if (self::$fh) {
fclose(self::$fh);
}
}
//note that if the size of the log file is larger than memory_limit, you
//may run into problems.
//returns all the logs
static function get_logs($truncate = TRUE) {
$logs = array();
if (self::log_open()) {
while (!feof(self::$fh)) {
$logs[] = unserialize(fgets(self::$fh));
}
//if the logs should be clear, then...
if ($truncate) {
fclose(self::$fh); //close and nullify handle
self::$fh = null;
unlink(self::log_path()); //then delete log file.
}
}
return $logs;
}
}
然后你可以通过
添加错误SessionLogger::add_log($error);
您也可以通过
来阅读日志SessionLogger::get_logs(true); //or false if you don't want to delete file.