Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 会话数组的最大深度_Php_Session_Trace_Depth - Fatal编程技术网

Php 会话数组的最大深度

Php 会话数组的最大深度,php,session,trace,depth,Php,Session,Trace,Depth,我有一个非常有趣的问题,我想知道是否有人能为我提供一个好的解决方案: 我将所有可能的错误都记录在日志文件中。 包括异常、致命错误、警告、通知、JS错误(通过Ajax发送) 现在,出于调试的目的,我还想在HTML页面上显示所有这些错误(因此我不需要检查日志文件) 因此,我将所有新错误存储在会话变量中。当用户看到它时,它将从会话中删除 我的问题: 错误/异常的php回溯包含大量信息。包括全局变量,如$\u会话 由于我将所有信息存储在会话中,因此每次出错后会话大小都会加倍。(会话中的每条错误消息包含此

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

我将所有可能的错误都记录在日志文件中。 包括异常、致命错误、警告、通知、JS错误(通过Ajax发送)

现在,出于调试的目的,我还想在HTML页面上显示所有这些错误(因此我不需要检查日志文件)

因此,我将所有新错误存储在会话变量中。当用户看到它时,它将从会话中删除

我的问题:

错误/异常的php回溯包含大量信息。包括全局变量,如$\u会话

由于我将所有信息存储在会话中,因此每次出错后会话大小都会加倍。(会话中的每条错误消息包含此错误之前会话的全部内容)

例如:

无错误:

$_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在回溯中存储全局变量吗


目前,我没有将跟踪存储在会话中,但也许有人知道更好的解决方案,在那里我仍然可以看到基本的跟踪信息,如果我没有弄错的话,你要做的是在每个会话中都有一些错误日志,稍后可以阅读

我的建议是为每个会话创建单独的日志文件,您可以使用会话id标识日志文件,该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.

对于您要做的事情,有现成的解决方案,比如xdebugThank,这是一个很好的解决方案。但这不是比在会话中存储要慢很多吗?(我有很多文件操作,会话可能一直在RAM中)除了使用RAM存储或数据库存储外,您的会话在每次请求后仍将写入文件,您可以修改此代码,使其仅在关闭时写入文件。当您使用会话时,文件中的所有数据在请求启动时加载到RAM中,这与此不同,它只会增量写入单个请求中生成的错误,从而节省RAM。