目前,我有一个记录器,它记录错误和回溯。记录器通过 将回溯序列化为 JSON json_encode()
。
让我们看一些假设的代码......
<?php
error_reporting(-1); // show all errors
function test($b){
echo json_encode(debug_backtrace()); // take a backtrace snapshot
}
$c = imagecreate(50,50); // create a resource...
test($c); // ...and pass to function
?>
如果您运行上面的代码,我们将看到如下内容:
警告: json_encode() [function.json-encode]:类型不受支持,在第 5 行的 /code/ch6gVw 中编码为 null [{"file":"/code/ch6gVw","line":8,"function" :"test","args":[null]}]
我们可以注意到这里发生了两件事:
- 记录器本身正在引起警告!坏坏坏!
- 记录的数据告诉我们我们向函数传递了一个空值?!?!
所以,我提出的解决方案是这样的:
foreach($trace as $i=>$v)
if(is_resource($v))
$trace[$i] = (string)$v.' ('.get_resource_type($v).')';
结果看起来像Resource id #1 (gd)
然而,这可能会导致一些严重的问题。
- 我们需要以某种方式跟踪我们循环通过的数组,以避免在数组引用自身时陷入无限循环(
$GLOBALS
往往会导致这种混乱)。 - 我们还必须转换对象属性的资源,但与数组不同,对象不是原始事物的副本,因此更改属性会更改活动对象。另一方面,它对
clone()
对象有多安全? - 这样的循环不会严重减慢服务器的速度(回溯往往很大,不是)?