В настоящее время у меня есть регистратор, который регистрирует ошибки вместе с обратным следом.
Регистратор сериализует обратную трассировку в 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]: тип не поддерживается, кодируется как ноль в / code / ch6gVw в строке 5
[{ "Файл": "/ код / ch6gVw", "линия": 8, "функция": "Тест", "арг": [пустой]}]
Здесь можно заметить две вещи:
- Сам логгер вызывает предупреждение! Плохо, плохо, плохо!
- Зарегистрированные данные говорят нам, что мы передали нуль в функцию?!?!
Итак, мое предлагаемое решение выглядит примерно так:
foreach($trace as $i=>$v)
if(is_resource($v))
$trace[$i] = (string)$v.' ('.get_resource_type($v).')';
Результат будет выглядеть как Resource id #1 (gd)
Это, однако, может вызвать серьезные проблемы.
- Нам нужно как-то отследить, какие массивы мы перебрали, чтобы избежать попадания в бесконечные циклы с ссылками на сами массивы (
$GLOBALS
имеет тенденцию вызывать этот беспорядок).
- Нам также пришлось бы преобразовывать ресурсы свойств объекта, но объекты, в отличие от массивов, не являются копией оригинальной вещи, поэтому изменение свойства приводит к изменению живого объекта. С другой стороны, насколько это безопасно для
clone()
объекта?
- Не приведет ли такой цикл к значительному замедлению работы сервера (следы, как правило, большие, нет)?