Я заметил, что когда у меня есть бесконечный работник, я не могу профилировать сценарии оболочки PHP. Потому что когда его убивают, он не отправляет зонд.
Какие изменения я должен сделать?
Когда вы пытаетесь профилировать работника, который выполняет бесконечный цикл. В этом случае вы должны вручную отредактировать свой код, чтобы удалить бесконечный цикл, или использовать свой код для ручного вызова метода 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.
Я не знаю, может быть, в 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
и отправить последний зонд. После этого он прекратит профилирование.