Является ли debug_backtrace() безопасным для серьезного использования в производственной среде?

Его функциональность настолько сильна, что я беспокоюсь о его стабильности и производительности.

Как вы думаете?

ОБНОВИТЬ

Что я делаю, так это:

    $old_dir = getcwd();
    chdir( dirname($included_file) );
    include ( $included_file );
    chdir( $old_dir );

По сути это просто include ( $included_file );но внутри $included_file это не может найти 3.php который находится в том же каталоге, что и сам, поэтому я вручную установил cwd, и он работает. Но было бы хорошо, если бы я нашел причину, по которой он не может найти. Как и почему debug_backtrace нужно, потому что 3.php включен другим func, поскольку относительный путь не работает, он должен использовать debug_backtrace чтобы получить включаемый путь к файлу, наконец, используя абсолютный путь, как указано ниже.

Воспроизвести нелегко, так как приведенный выше код находится в контексте метода и многого другого. Если никто больше не сталкивался с подобной проблемой, я бы хотел остановиться здесь, во всяком случае, стоимость всего лишь 3 дополнительных линии, не имеет большого значения.

3 ответа

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

Для любого вида регистрации ошибок я думаю, что это довольно неоценимо, и потому что это будет вызываться только один раз, определенно не проблема производительности. Конечно, всегда полезно включить обратную трассировку в сообщение об ошибке.

Я не могу понять, почему возникли какие-то конкретные проблемы со стабильностью этой функции (то есть вызов ее вызвал еще один сбой), я никогда не слышал о каких-либо проблемах. Единственная "ошибка", которую я вижу, - это примечание в комментариях пользователя при использовании объектов в качестве параметров функции, которые не имеют _toString метод определен.

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

Что ж, учитывая его название, я не уверен, что использовал бы его как "нормальную" часть своего приложения - даже если я не помню, чтобы читал что-либо, в котором говорилось, что это было либо хорошо, либо плохо.


Я действительно не знаю, что вы имеете в виду под "серьезным использованием", но:

  • Если вам нужна эта функция для работы вашего приложения, это может указывать на некоторые проблемы в вашем дизайне
  • Эта функция может быть полезна в обработчике ошибок, когда вы хотите регистрировать, как / где произошла ошибка: она сделает файлы журналов более полезными, когда дело доходит до выявления источников ошибок

Хотя, не уверены, что "регистрация ошибок" соответствует вашему определению серьезного использования?

Хорошо, насколько я понимаю, проблема заключается в следующем

У вас есть файл php, давайте назовем его "main.php". В "main.php" вы включаете "A.php" из некоторого каталога:

# in "main.php"
include '/some/dir/A.php';

A.php, в свою очередь, включает в себя "B.php", который находится в том же каталоге, что и A.php

# in "A.php"
include 'B.php'; 

проблема: поскольку "/some/dir/" (где находятся A и B) не является текущим для "main.php", php не видит B.php от A.php

решение: в A.php использовать полный путь к /some/dir, Либо жестко закодируйте его, либо получите динамически через dirname(__FILE__)

# in "A.php"
include dirname(__FILE__) .'/B.php';
Другие вопросы по тегам