Я работаю над проектом, который включает профилирование потока выполнения.
Я создал отдельный класс для профилировщика, и каждый раз, когда мне нужно что-то профилировать, я создаю экземпляр объекта класса профилировщика и запускаю мониторинг.
$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();
}
}
Это создает интересную круговую зависимость. Класс запроса запускает профилировщик, который запускает запрос, и запрос снова запрашивает профилировщик.
Есть идеи, чтобы это исправить?
Для тех, у кого возникла подобная проблема, это обходной путь, который я построил, чтобы решить эту проблему.
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 проверяют, активен ли профилировщик или нет. Не уверен, что это лучший способ сделать это, но это решило мою проблему.
Других решений пока нет …