我注意到当我有一个无穷无尽的工人时,我无法分析 PHP shell 脚本。因为当它被杀死时,它不会发送探测。
我要做什么改变?
当您尝试分析正在运行无限循环的工作人员时。在这种情况下,您必须手动编辑代码以删除无限循环或检测代码以手动调用探针的 close() 方法(https://blackfire.io/doc/manual-instrumentation)。
这是因为只有在调用 close() 方法时才会将数据发送到代理(除非您将其杀死,否则它会在程序结束时自动调用)。
您可以使用与 Blackfire 的探针捆绑在一起的 BlackfireProbe 类手动检测一些代码:
// 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 或 blackfire CLI 实用程序运行时才处于活动状态。如果不是,则所有呼叫都转换为 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 到这个 worker 的进程并LoopClient
开始分析。它将侦听 10 次方法迭代consume
并发送最后一个探测。之后它将停止分析。