Проблемы с трассировкой файла и строки для ведения журнала отладки (PHP) - PullRequest
0 голосов
/ 24 января 2011

Итак, я пытаюсь создать метод, который позволяет регистрировать отладочные сообщения на лету, и я хотел бы указать имя файла и номер строки, где произошло сообщение.Моим первым желанием было дать debug_backtrace () в качестве одного из аргументов метода ведения журнала, который возвращает массив, который содержит текущее имя файла и номер строки.

Проблема в том, что это дает только файл и строкусамого первого файла с именем (index.php).index.php - это всего лишь пятистрочный файл, который вызывает метод из класса во включаемом файле, поэтому строка и информация о файле всегда говорят (index.php, строка 5) независимо от того, что они бесполезны.

Есть ли способ получить текущую строку и файл независимо от того, где в коде вы находитесь?

Добавление

Вот информация о файле и строке:

[2011-01-23 06:26:10] Информация: «Запрос сделан для несуществующего контроллера (тест).», Файл: «/home/spotless/public_html/mymvc/index.php", Строка: 5, запрос:" / test "

Вот index.php во всей его полноте:

<?php

    include_once('application/init.php');
    lev_init::init();
?>

Вот вызов журнала с использованием debug_backtrace ()в файле init.php (строка 37):

// if requested controller does not exist, log
lev_logging::message('Request made for non-existant controller ('.$requested_controller.').', debug_backtrace());

второе обновление

var_dump массива debug_backtrace

(1) {[0] => array (6) {["file"] => string (42) "/home/spotless/public_html/mymvc/index.php" ["line"] => int (5) ["function "] => string (4)" init "[" class "] => string (8)" lev_init "["type"] => string (2) "::" ["args"] => array (0) {}}}

Ответы [ 2 ]

2 голосов
/ 24 января 2011

Если вы находитесь в глобальном контексте с этим, а не с функцией, то вы показываете нормальное поведение.Включение файлов не отражается в стеке вызовов - только вызов функций и методов.

Насколько я знаю, нет способа построить "трассировку включения"список вложенных включает в себя строку кода. Это неоднократно задавалось SO и IIRC, решение не было найдено.

1 голос
/ 24 января 2011

debug_backtrace возвращает массив, поэтому var_export(debug_backtrace(), true)

т.е:.

// if requested controller does not exist, log
lev_logging::message('Request made for non-existant controller ('.$requested_controller.').', var_export(debug_backtrace(), true));

Примечание:

просто и отредактируйте что / где имеет значение трассировка стека.

<?php
// filename: /tmp/a.php

function b_test($foo)
{
   var_dump(debug_backtrace());
}

function a_test($str)
{
    echo "\nHi: $str";
    b_test('bar');
    var_dump(debug_backtrace());
}

a_test('friend');
?>

<?php
// filename: /tmp/b.php
include_once '/tmp/a.php';

?>

debug_backtrace в b_test покажет все до включения. тот, что в a_test не будет отображать вызов b_test, так как он вернулся ...

...