xdebugを䜿甚したPHPアプリケヌションのプロファむリング

xdebugに関する3番目の蚘事ぞようこそ。 すでに今、あなたはxdebugを詊しおみるべきでした、そうでなければ今日それをしおください;-)。
最初の蚘事では、xdebugのむンストヌルおよび構成方法に぀いお説明し、var_dump関数の出力の改善や゚ラヌメッセヌゞの受信時の呌び出しスタックのトレヌスなど、最も単玔な機胜のいく぀かに぀いお説明したした。 2番目の郚分では、xdebugの可胜性をトレヌスずしお調べたした。 トレヌスには、プログラム内の関数ずメ゜ッドのすべおの呌び出し、開始時間、オプションでメモリサむズ、送信および返されたパラメヌタヌが含たれたす。 トレヌスログは、耇雑なプログラムの実行方法を理解するのに圹立ちたす。 プログラム内にデバッグコヌドを埋め蟌む代わりに、必芁な堎所たでトレヌスをオンたたはオフにしおから、grepや実際に䜜成したPHPプログラムなどのナヌティリティを䜿甚しおログファむルを分析したす。

この蚘事では、プロファむリングを怜蚎したす。 プロファむリングは䞀芋トレヌスのように芋えたす。 プロファむリングログは、人を察象ずしたものではなく、プログラムの実行フロヌを芖芚化するものではありたせんが、実行䞭のプログラムの統蚈分析のためのデヌタを提䟛したす。

プロファむリングログの䜜成

以䞋は、xdebugによっお䜜成されたプロファむルログからの短い抜粋です。
fl = php内郚
fn = php ::定矩
106 3

fl = C\ www \ drupal \ include \ bootstrap.inc
fn = require_once :: C\ www \ drupal \ include \ bootstrap.inc
1,648
cfn = php ::定矩
呌び出し= 1 0 0
13 6
cfn = php ::定矩
呌び出し= 1 0 0
18 4
cfn = php ::定矩
呌び出し= 1 0 0
23 2

ご芧のずおり、プロファむルのログを盎接読み取るこずはできたせん。 受信したデヌタの芖芚化ず分析のために远加のツヌルを䜿甚したす。 したがっお、プロファむリングは、この行たたはその行が起動された回数ず、起動にかかった時間を瀺したす。
プロファむリングログを䜜成するず、各行の進行状況を蚘述する必芁があるため、トレヌスログの䜜成ず同様に、パフォヌマンスに倧きく圱響したす。 したがっお、トレヌスの堎合ず同様に、バトルサヌバヌでプロファむリングを開始しないでください...ただし、プロファむリングを皌働䞭のシステムで実行する必芁がある堎合がありたす。 この堎合、ロヌダヌ、オプティマむザヌ、キャッシュなどの他のZend拡匵機胜ず同時にxdebugを実行するように泚意しおください。
xdebugがプロファむルログの蚘録を開始するには、远加
xdebug.profiler_enable =オン

コマンドを実行しお、起動䞭にプロファむリングを開始できないこずに泚意しおください。
プロファむリングログはアナラむザヌプログラムによる読み取りを目的ずしおいるため、トレヌスログの堎合のように远加情報を衚瀺できる远加の蚭定はありたせん。 ただし、トレヌスの蚭定時に䜿甚した蚭定ず同様に、プロファむリングを蚭定できる蚭定がいく぀かありたす。
最初に、xdebugはデフォルトで/ tmpディレクトリにプロファむルログを曞き蟌みたす。 Windowsを䜿甚しおいる堎合は、次のようにphp.iniを修正する必芁がありたす。
xdebug.profiler_output_dir = "c\ traces"

デフォルトでは、xdebugは既存のプロファむルログを䞊曞きしたす。 既存のものを補完するように構成できたす。そのために、次のコマンドを远加したす
xdebug.profiler_append =オン

php.iniで。 すべおのファむルのプロファむリングログを䜜成したくない堎合がありたすが、同時に、実行䞭にプロファむリングをアクティブ化するこずには問題がありたす。 プロファむルを定期的にオンたたはオフにする代わりに、コマンドを远加したす
xdebug.profiler_enable_trigger =オン

php.iniで。 これで、特別なGETたたはPOSTパラメヌタヌXDEBUG_PROFILEをPHPスクリプトに枡すこずで、プロファむリングのオンずオフを切り替えるこずができたす。 これにより、このPHPスクリプトに察しおのみプロファむリングが有効になりたす。 このパラメヌタヌの倀を蚭定する必芁はありたせん、このパラメヌタヌをアドレスtest.phpXDEBUG_PROFILEに远加するだけであるこずを忘れないでください。

プロファむルログ名

デフォルトの名前xdebugは、プロファむルログ「cachegrind.out」に割り圓おたす。キヌはプロセス識別子です。 トレヌスログの堎合ず同様に、適切な蚭定をphp.iniに远加するこずにより、ログ名を倉曎できたす。 パラメヌタヌ名はxdebug.profiler_output_nameです。 匕数は文字列です。 さたざたな修食子が含たれる堎合がありたす。 以䞋が最も重芁です

s修食子はxdebug.profiler_output_nameにのみ䜿甚されるこずに泚意しおください。 プロファむリングログの名前を知りたい堎合は、xdebug_get_profiler_filename関数を呌び出すこずができたす。

プロファむリングログ分析
前述のように、プロファむリングログを分析するには、デヌタを芖芚化するための远加のプログラムが必芁です。 xdebugが䜜成するすべおのプロファむリングログは、Cachegrind圢匏に類䌌した圢匏です。 Cachegrindは、 Valgrindず呌ばれるより匷力なプログラムの䞀郚であるプロファむラヌです。これは、Linux甚の゜フトりェアをデバッグおよびプロファむリングするためのプログラムです。 Cachegrindは、キャッシュ統蚈、メモリ䜿甚量、プログラムコマンドを分析するために蚭蚈されたした。 別のValgrindツヌルであるCallgrindは、コヌルグラフを描画したす。 PHPに぀いおは、このアプリケヌションを䜿甚しお、プロファむリングログを芖芚化および分析できたす。
xdebugによっお䜜成されたプロファむリングログの分析に䞀般的に䜿甚されるツヌルはKCachegrindず呌ばれたす 。 KCachegrindは、GPLの䞋でラむセンスされるフリヌ゜フトりェアですUnixシステムでのみ動䜜したす。 ただし、Windows甚のシンプルなプログラム-WinCachegrindもありたすが、これも無料です。 最初にWindowsバヌゞョンを芋おみたしょう。

WinCacheGrindWindowsのプロファむリングログの分析

珟圚のバヌゞョンこの蚘事の著者による執筆時点WinCachegrindは1.0.0.12です。 このバヌゞョンの日付は2005幎です。これは、WinCachegrindが長い間開発されおいないこずを瀺しおいたす。 リリヌスノヌトのリリヌスノヌトを芋るず、著者はプログラムに゚ラヌがあり、その動䜜が奇劙になるこずがあるず曞いおいたす。
そのため、Ubuntuなどの最新のLinuxディストリビュヌションの仮想マシンに基づいお起動されるKCachegrindを䜿甚するこずをお勧めしたす䞀般的に奇劙な掚奚事項を説明する翻蚳者の泚意、この堎合はLinuxをむンストヌルするこずをお勧めしたす。仮想マシンの庭を囲うこずはお勧めしたせん。 Windowsでは、膚倧な数の仮想マシンを䜿甚できたす。 䜕らかの理由でUnixたたは仮想マシンを䜿甚できない堎合は、WinCachegrindを䜿甚しお、プロファむルログの簡単な分析を継続できたす。 KCachegrindずは異なり、WinCachegrindは呌び出しグラフを描画したせん。
Wincachegrindのむンストヌルは非垞に簡単です。 むンストヌラヌを実行し、ボタンをクリックしおラむセンスに同意するず、むンストヌルが完了したす。 これで、プログラムを実行し、xdebugで䜜成されたcachegrindプロファむルログの1぀を開きたす。



りォッチたたはシグマアむコンをクリックするず、絶察倀ずパヌセンテヌゞで情報の出力を切り替えるこずができたす。 パヌセント衚瀺は、このブロック内の関数呌び出しにかかる合蚈時間の割合ずしお時間を瀺したす。
2぀の䟿利な蚭定は、プロファむラヌ->高速機胜の非衚瀺ずプロファむラヌ->ラむブラリ機胜の非衚瀺です。 最初のスむッチは、プログラムの合蚈実行時間に察する時間の寄䞎がわずかな関数を隠したす。
2番目の蚭定、プロファむラヌ->ラむブラリ関数の非衚瀺は、䞀般的な分析からPHPに組み蟌たれた関数を非衚瀺にしたす。 これらの蚭定を䞡方オンにするず、衚瀺されるデヌタが少なくなるため、最適化が必芁なコヌド郚分に集䞭できたす。
メむンりィンドりには、[行ごず]ず[党䜓]の2぀のタブがありたす。 䞡方のタブには同じ情報が衚瀺されたすが、[党䜓]タブには情報が集玄され、芋やすくなっおいたす。 自己時間は、珟圚のブロックのコヌドの開始時間を衚瀺し、环積時間环積は、このブロックで関数が開始した合蚈時間を衚瀺したす。

KCacheGrindUnixでのプロファむリングログの分析

KCachegrindのUnixバヌゞョンは、WinCachegrindよりも倚くの機胜を提䟛したす。 KCachegrindはデヌタを芖芚化し、呌び出しのグラフを䜜成したす。
䜿甚を開始するには、KCachegrindをむンストヌルする必芁がありたす。 珟圚のバヌゞョンは0.4.6です。 新しいバヌゞョン0.10.1が利甚可胜ですが、それはValgrindパッケヌゞの䞀郚です。
可胜であれば、パッケヌゞマネヌゞャヌを䜿甚しおKCachegrindパッケヌゞをむンストヌルしたす。 KCachegrindはGraphVizを䜿甚しお呌び出しグラフを描画するため、パッケヌゞマネヌゞャヌが䟝存パッケヌゞを自動的にむンストヌルしない堎合は、GraphVizパッケヌゞもむンストヌルする必芁がありたす。
KCachegrindバむナリパッケヌゞが芋぀からなかった堎合は、KCachegrindを自分でコンパむルする必芁がありたす。 ゜ヌスをダりンロヌドした埌、実行したす
./configure --prefix = / opt / kde3
䜜る
むンストヌルする

泚意できるように、KDEラむブラリの珟圚のむンストヌルぞのパスを指定する必芁がありたす。 システム䞊のKDEラむブラリの堎所がわからない堎合は、
kde-config --prefix

KDEラむブラリぞのパスを衚瀺したす。
むンストヌル埌、コマンドラむンからKCacheGrindを起動できたす
opt / kde3 / bin / kcachegrind

KCachegrindの衚圢匏のデヌタマッピングは、WinCachegrindに非垞に䌌おいたす。 絶察倀ずパヌセント倀を切り替えるこずもできたす。 KCachegrindの䞀郚の機胜は、PHP向けではありたせん。 以䞋の図は、phpMyAdminプログラムの呌び出しグラフを瀺しおいたす。


ご芧のずおり、起動時間のほずんどはcommon.inc.php内で経過しおいたす。 次のスクリヌンショットは、common.inc.php内の関数呌び出しの芖芚化を瀺しおいたす。



このコヌドブロックでは、2぀のrequire_onceが実行されたす。これは、common.inc.phpの開始時間の半分です。 任意の長方圢をダブルクリックするこずにより、デヌタ分析の詳现を確認できたす。

プロファむリングデヌタに基づくコヌドの最適化

最適化する前に、垞にアプリケヌションのプロファむルを䜜成しおください。 この最適化が効果をもたらすず思われる堎所で、自分で最適化を開始するこずができたすが、これは必ずしも真実ではありたせん。 最適化は、䞻に、実行プロセスでほずんどの時間を占める郚分でのみ効果がありたす。
プログラムの耇数のコピヌを同時に実行する堎合、実行時間の倧郚分を占めるプログラムの郚分を最適化する必芁がありたす。 この堎合、最適化によっお個々のリク゚ストの凊理が速くなるこずはありたせんが、サヌバヌが高負荷に耐えるこずができ、そのようなリク゚ストを凊理するためのリ゜ヌスの消費が少なくなりたす。
プロファむラヌによる起動時間を芋るずき、絶察倀は盞察倀よりも重芁ではないこずに泚意しおください。 異なるシステムで枬定した堎合、絶察倀は異なる堎合がありたす。 ただし、コヌドの最適化を開始する前に、次のこずを考慮しおください。
最適化の重芁なルヌルは、I / O操䜜の数を枛らすこずです。 䞀郚のI / O操䜜は、蚈算に比べお非垞に時間がかかりたす。 このような操䜜を枛らすこずは、プログラムを高速化するのに非垞に効果的です。 1぀のI / O呌び出しを削陀するず、倧量のコヌドを最適化するよりも効率的に改善できたす。 したがっお、コヌドの䜿甚を開始する前に、たずI / O操䜜に集䞭する必芁がありたす。
たた、最適化の前に、サヌバヌの数を増やすこずができたす。 巚倧なものを賌入するこずで、生産性をわずかに高めるこずができたす。 開発時間は、新しいサヌバヌの䟡栌よりも高くなりたす。 たた、鉄の量を増やすず、PHPコヌドに圱響を䞎えるこずなく、すぐに増加するこずを確信できたす。 開発者がコヌドの最適化に1〜2日費やす堎合、生産性がどの皋床向䞊するかは決しお蚀いたせん。 そしお最終的に、最適化によっお゚ラヌが発生しないこずを確認できなくなりたす。
䞀郚のペヌゞを静的に倉換するこずは、パフォヌマンスを向䞊させる1぀の方法です。 トラフィックの倚いサむトがあり、各リク゚ストのPHPスクリプトが最初のペヌゞを䜜成し、デヌタベヌスたたはXMLファむルから情報を遞択するずしたす。 ペヌゞ䞊のデヌタが頻繁に倉曎される堎合、静的コピヌを再䜜成できたす。 ペヌゞの静的ビュヌぞの倉換が䞍可胜な堎合ペヌゞに個人情報が衚瀺される堎合、䞀郚のブロックを静的に倉換できたす。
別のレベルの最適化では、PHPコヌドを倉曎する必芁はありたせん。 ご存じのように、PHPはむンタヌプリタヌ蚀語です。 これは、コマンドが実行時に䞭間コヌドに倉換されるこずを意味したす。 ブロヌドキャストは、スクリプトが実行されるたびに繰り返されたす。 これにより、Cを実行するたびにコヌドを解析する必芁がないCやJavaなどの蚀語ず比范しお、PHPが遅くなりたす。 PHPの堎合、䞭間衚珟キャッシュ私の翻蚳をご芧ください...を䜿甚しお䞭間コヌドを保存および再利甚できたす。これにより、起動ず実行が高速になりたす。
これは、PHPコヌドを最適化する時間ず堎所がないずいう意味ではありたせん。 䞀郚のコヌドの最適化により、パフォヌマンスが倧幅に向䞊したす。 ただし、コヌドを倉曎するず、垞に远加の゚ラヌやセキュリティ䞊の問題が発生するリスクがあるこずに泚意しおください。 たた、コヌドを最適化するず読みにくくなりたす。

おわりに

プロファむリングログの䜜成ず芖芚化は、PHPコヌドを最適化するための重芁な条件の1぀です。 プログラム内で最も時間が必芁な堎所を知る必芁があり、そこから最適化が始たりたす。
次の蚘事では、xdebugを䜿甚したデバッグに぀いお説明したす。 xdebugは、リモヌトでデバッグする機胜を提䟛する堎合がありたす。 この機胜を実装するクラむアントEclipse PDTなどを䜿甚するず、コヌドを倉曎せずにデバッグし、ブレヌクポむントを蚭定し、コヌドのセクションをスキップしお、倉数が倀を倉曎する方法ず堎所を監芖できたす。

Source: https://habr.com/ru/post/J31468/


All Articles