3

無限のワーカーがあると、PHP シェル スクリプトをプロファイリングできないことに気付きました。殺されるとプローブを送信しないためです。

どのような変更を行えばよいですか?

4

2 に答える 2

3

無限ループを実行しているワーカーをプロファイリングしようとしているとき。この場合、コードを手動で編集して無限ループを削除するか、プローブの 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-06-04T13:49:46.733 に答える
0

わかりません。おそらく 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し、最後のプローブを送信します。その後、プロファイリングを停止します。

于 2018-06-07T11:24:50.570 に答える