профилирование — круговая зависимость между классами переполнения стека

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

$profiler=new Profiler($params);
$profiler->start();
//the code to be monitored//
$profiler->end();

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

void _construct($params){
$this->checkConfig($params);
}

Функция checkConfig выполняет запрос к базе данных для получения конфигурации.

Теперь команда планирует отслеживать запросы к базе данных (которые выполняются через класс запросов в нашем случае). Я попробовал аналогичную реализацию для функции executeQuery:

class Query{
public function executeQuery($queryParams){
$profiler=new Profiler($params);
$profiler->start();
/*Execute query*/
$profiler->end();
}
}

Это создает интересную круговую зависимость. Класс запроса запускает профилировщик, который запускает запрос, и запрос снова запрашивает профилировщик.

Есть идеи, чтобы это исправить?

1

Решение

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

class Query{
public function executeQuery($queryParams){
static $checkProfiler;
if(!isset($checkProfiler)){
$profiler=new Profiler($params);
$checkProfiler=1;
}
$profiler->start();
/*Execute query*/
$profiler->end();
unset($checkProfiler);
}
}

Методы start и end проверяют, активен ли профилировщик или нет. Не уверен, что это лучший способ сделать это, но это решило мою проблему.

1

Другие решения

Других решений пока нет …