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