ホームページ  >  記事  >  バックエンド開発  >  あなたが長い間待ち望んでいた PHP コードの救世主、Deliverer が登場しました。

あなたが長い間待ち望んでいた PHP コードの救世主、Deliverer が登場しました。

醉折花枝作酒筹
醉折花枝作酒筹転載
2021-06-24 16:05:491917ブラウズ

コードの一部で完全な呼び出しチェーンを確認できない場合、完全な呼び出しチェーン全体を明確にクエリするのに役立つツールが必要ですか?今回はエディターが PHP の Deliverer について学習するため、コードのトラブルシューティングについて心配する必要はなくなります。

あなたが長い間待ち望んでいた PHP コードの救世主、Deliverer が登場しました。

数日前、グループの友人が先祖代々のコードを乗っ取りました。長い間トラブルシューティングを続けましたが、解決されませんでした。彼は、コードを持って逃げる準備をしていました。バケットを作成し、最終的に彼がそれを解決するのを助けました。完全なプロセスは https://mengkang.net/1470.html で見つけることができます。ただし、最終的なコードの位置は私の個人的な経験に基づいています。実際に呼び出されるリンクは、私が呼び出したものとは異なります。予想されており、すべて推測に基づいています。完全な呼び出しチェーンが表示されなかったので、呼び出しチェーン全体の明示的なクエリを支援するツールが必要だと思いました。

そこで私は、主に日常環境で再現するのが難しい不慣れなプロジェクトやオンライン シナリオのためにこのツールを構築しました。

deliver 祖先コードのエスケープ救助者 https://github.com/zhoumengka...

プロジェクトがそれほど悪くなく、日々の環境が問題ない場合は、そうするのが最善ですプロジェクトに精通している メソッドは依然として xdebug です。このツールは主にオンラインの問題のトラブルシューティングに使用されます。
同様のツールには 360 の phptrace 実装原則が含まれますが、これは若干異なります

関数ポイント

  • 関数名、クラスに基づくことができますname、メソッド名とルートを使用して出力をフィルタリングします

  • 指定されたフィルタリングされたコンテンツを n 回クエリした後に終了できます

  • 再生できますリクエスト ID に基づいてリクエスト全体を返します。 完全なコール チェーン

  • #フィルターされたコンテンツが強調表示されます。

  • コール スタックが深い場合は、 -l を指定すると、深い呼び出しの表示を非表示にできます。

原則

実際には、これは比較的単純です。 2 つのステップ。最初のステップはログを収集し、2 番目のステップはログを分析します。

ステップ 1

PHP_MINIT ステージで、zend_set_user_opcode_handler を使用して、3 種類のオペコード (ZEND_DO_UCALL、ZEND_DO_FCALL_BY_NAME、および ZEND_DO_FCALL) の処理と分析をセットアップします。

これはいくつかの組み込み関数とメソッドの呼び出しをカバーしており、タイプによってフィルターできることに注意してください。

次に、PHP_RINIT ステージで新しいログ ファイルを作成し、要求された情報を書き込みます。

pid-ts sapi http_method http_url

要求プロセス中に、コール スタック情報をカスタム ハンドラーに出力します。

最後に閉じます。 PHP_RSHUTDOWN のログ ファイルの書き込み

第 2 ステップ

bin/deliverer を使用して、収集されたログを分析および整理します。これは PHP スクリプトであるため、ここでは説明しません詳細に入ります。

#インストールして使用する

#コンパイル

#
$ phpize
$ ./configure --with-php-config=/usr/local/php/bin/php-config
$ make && sudo make install
#php.ini を設定

Append
[deliverer]
extension=deliverer.so

php-fpm

sudo service php-fpm restart

分析ツールを使用

./bin/deliverer を次の場所に移動できます。これが適切なディレクトリであると思われる場所で、現在のディレクトリ
$ chmod +x deliverer
で、昔からの私自身の祖先コード (私のブログ) の一部

$ ./bin/deliverer -t

を使用して実行すると、常に監視されます。すべての php プロセスの実行

$ ./bin/deliverer -tAction::initUser -n3 -l5

あなたが長い間待ち望んでいた PHP コードの救世主、Deliverer が登場しました。

あなたが長い間待ち望んでいた PHP コードの救世主、Deliverer が登場しました。

あなたが長い間待ち望んでいた PHP コードの救世主、Deliverer が登場しました。##パラメータ

値 説明-tAction::initUserフィルターこの呼び出しを含むリクエスト-n33 回カウントして終了-l 5関数(メソッド)は深さ表示を呼び出しており、最大5層まで表示されます。余分な部分は最後にマークされます-v requestId を使用して完全な詳細を表示します。呼び出しスタック
$ ./bin/deliverer -tSqlExecute::getAll -n1 -l3
##
$ ./bin/deliverer -v7979-1624369150991941
メソッドをクエリするとき、関数呼び出しスタックが深すぎて、階層クエリ範囲内にありません。 、その外側の呼び出しは赤色で表示されます

あなたが長い間待ち望んでいた PHP コードの救世主、Deliverer が登場しました。

推奨される学習:

php ビデオ チュートリアル

以上があなたが長い間待ち望んでいた PHP コードの救世主、Deliverer が登場しました。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。