2014-09-16 2 views
1

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

$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(); 
} 
} 

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

Любые идеи исправить это?

+0

Внедрить класс 'Query' в профилировщик? В любом случае у вас есть ошибки в вашем коде: метод 'executeQuery' передает несуществующую переменную' $ params' в конструктор 'Profiler' –

+0

У меня была такая же проблема, когда я реализовал прослушиватели для своего класса DB. Когда я реализовал и зарегистрировал слушателя с запросами БД, слушатель снова вызвался в слушателе, поэтому я оказался в бесконечном цикле. То, что я тогда реализовал в классе DB, является функцией 'muteListener()', которая при установке 'true' прекращает прослушивание прослушивателей. Итак, в моем слушателе до того, как я произвел запрос БД, я установил 'muteListener (true)' и после запроса? false "снова. – TiMESPLiNTER

+0

@EliasVanOotegem params var предназначен только для демонстрационной цели. Функция executequery передаст некоторую реальную информацию, чтобы узнать, должен ли быть профилирован текущий запрос. – nullPointer

ответ

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); 
} 
} 

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

Смежные вопросы