Как профилировать приложение сценария PHP или работника с помощью Blackfire

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

Какие изменения я должен сделать?

3

Решение

Когда вы пытаетесь профилировать работника, который выполняет бесконечный цикл. В этом случае вы должны вручную отредактировать свой код, чтобы удалить бесконечный цикл, или использовать свой код для ручного вызова метода close () зонда (https://blackfire.io/doc/manual-instrumentation).

Это связано с тем, что данные отправляются агенту только при вызове метода close () (он вызывается автоматически в конце программы, если вы не уничтожили его).

Вы можете вручную обработать некоторый код с помощью класса BlackfireProbe, который поставляется вместе с датчиком Blackfire:

// Get the probe main instance
$probe = BlackfireProbe::getMainInstance();
// start profiling the code
$probe->enable();

// Calling close() instead of disable() stops the profiling and forces the  collected data to be sent to Blackfire:

// stop the profiling
// send the result to Blackfire
$probe->close();

Как и в случае с автоматическим инструментированием, профилирование активно только тогда, когда код запускается через Companion или утилиту CLI Blackfire. Если нет, все вызовы преобразуются в noops.

3

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

Я не знаю, может быть, в 2015 году не было следующей страницы, но теперь вы можете выполнить профилирование следующим образом: https://blackfire.io/docs/24-days/17-php-sdk

$blackfire = new LoopClient(new Client(), 10);
$blackfire->setSignal(SIGUSR1);
$blackfire->attachReference(7);
$blackfire->promoteReferenceSignal(SIGUSR2);

for (;;) {
$blackfire->startLoop($profileConfig);

consume();

$blackfire->endLoop();

usleep(400000);
}

Теперь вы можете отправить сигнал SIGUSR1 процессу этого работника и LoopClient начну профилирование Это будет слушать 10 итераций метода consume и отправить последний зонд. После этого он прекратит профилирование.

0