会话数组的最大深度

时间:2013-07-06 13:54:08

标签: php session trace depth

我有一个非常有问题的问题,我想知道是否有人为我提供了一个很好的解决方案:

我正在记录日志文件中的每个可能错误。 包括异常,致命错误,警告,通知,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在回溯中存储全局变量?

目前,我没有在会话中存储跟踪,但也许有人知道更好的解决方案,我仍然可以看到基本的跟踪信息

1 个答案:

答案 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.