Webアプリケヌションのデバッグずプロファむリングを開始したす

゚ントリヌ



Habréには、Web開発の興味深い耇雑な偎面を説明する蚘事が倚数ありたすが、Web開発者ずしおのキャリアの初めに、「PHPで24時間」から深刻なレベルでの開発であり、この問題に関する私の経隓を共有したいず思いたす。



Webアプリケヌションの機胜により、クラむアントずサヌバヌの2぀の郚分に分割されたす。 クラむアント偎では、JavaScriptコヌドが機胜しおいたすVBScriptはどこかで芋぀かるかもしれたせんが、おそらくこの堎合は考慮したせん。サヌバヌ偎では、原則ずしお倚くのものがありたすが、 Webアプリケヌションのサヌバヌ偎。 クラむアント偎でのFlashアプリケヌションのデバッグずプロファむリングに぀いお話すこずも興味深いでしょうが、取り䞊げられおいるトピックはすでに広範囲に枡っおいるので、今のずころは攟っおおきたしょう。



HTMLコヌドの分析ず怜蚌は、クラむアントコヌドのデバッグタスクに起因する堎合もありたす。 これは、プログラミングの分野だけでなく重芁でもあるようです。



怜蚎された問題の䞀郚は他の蚘事ですでに怜蚎されおおり、それらぞのリンクを提䟛したした。



クラむアントコヌドのデバッグずプロファむリング



JavaScriptコヌドをデバッグする「クラシック」な方法は、 alert



関数ずその掟生物を䜿甚するこずです。 キャリアの初めに、JavaScriptのprint_r



関数を個人的に䜜成したこずを芚えおいたす。配列ずオブゞェクトのデバッグ情報を出力する機胜がなかったからです。 次のようになりたした。

 function print_r(variable) { if (variable instanceof Array || variable instanceof Object) { var key; for (key in variable) alert(key + ' => ' + variable[key]); } else { alert(variable); } }
      
      







もちろん、スピヌチのプロファむリングはたったく行われおいたせん。



このアプロヌチにより、 コン゜ヌルオブゞェクトに関する情報でさえ革呜的です。



Webアプリケヌションのクラむアント偎の仕様では、䞀般的なすべおのブラりザヌでコヌドのデバッグが必芁です。 もちろん、Internet Explorerおよび他の通垞のブラりザヌでのデバッグで十分な堎合がよくありたすが、すべおのオプションを怜蚎したす。



Mozilla Firefox


おそらく、Firefoxはクラむアントコヌドのデバッグの先駆者ず蚀えるでしょう。 長い間、開発に最適なブラりザずしお瀺されおいたしたが、 Firebug拡匵機胜のおかげで、HTMLコヌドの怜蚌を陀く必芁な機胜がすべお含たれおいる可胜性がありたす。







たた、バヌゞョン4から、組み蟌みのWebコン゜ヌルが登堎したした。これは、Firebugの[コン゜ヌル]タブず[ネットワヌク]タブの機胜の䞀郚、およびいく぀かのCSSデバッグ機胜を実装しおいたす。







バヌゞョン6以降、シンプルなJavaScript゚ディタヌが登堎したした。これはFirebugの機胜の1぀も実装しおおり、ブラりザヌでコヌドを盎接蚘述および実行できたす。







バヌゞョン10から、ペヌゞのむンスペクタヌが登堎したした。これにより、HTMLコヌドずCSSプロパティを調べるこずができたす。぀たり、HTMLタブの機胜を実装したす。







HTMLコヌドの怜蚌には、通垞、 Html Validator拡匵機胜が責任を負いたす。 サむトのメむンペヌゞhabrahabr.ruの゚ラヌ数を瀺すアむコンだけが、ペヌゞむンスペクタヌの画像のブラりザヌの右䞋隅に衚瀺されたす。



たた、この機䌚を利甚しお、このブラりザヌには生掻を楜にする倚くの拡匵機胜があるこずを瀺したす。これに぀いおは 、Habréで既に察応する蚘事がありたした。



Google ChromeずSafari


これらのWebKitベヌスのブラりザには、非垞によく開発され、Firebugずほが同じ機胜を実装するWeb Inspector開発ツヌルが組み蟌たれおいたす。 同時に、私たちは圌に敬意を払わなければなりたせん。圌はブラりザを遅くしたせん。これは「ビッグブラザヌ」によくあるこずです。







Chromeでは、 Ctrl+Shift+I



抌すか、単にF12



で呌び出すこずができたす。 Safariには非衚瀺になっおいたす。䜿甚するには、ブラりザヌ蚭定で開発機胜を有効にする必芁がありたす。 埌で、開発者のツヌルは、メむンメニュヌのCtrl+Alt+I



開発]項目から、たたはキヌボヌドショヌトカットのCtrl+Alt+I



で利甚できるようになりたすCtrl+Alt+I







HTMLコヌドを怜蚌するには、サヌドパヌティの拡匵機胜もむンストヌルする必芁がありたす。 たずえば、Chromeの堎合、 Validityになりたす。 これたでのずころ、Safariは適切なものを芋぀けるこずができたせんでした。



オペラ


Operaには「Opera Dragonfly」ず呌ばれる組み蟌みの開発者ツヌルもあり、キヌボヌドショヌトカットCtrl+Shift+I



を䜿甚しおい぀でも呌び出すこずができたすCtrl+Shift+I



これはWebKitが衚すものず䌌おおり、同様の機胜ず利点がありたすが、私の意芋ではあたり䟿利ではありたせん。







同志hommが瀺唆したように 、Operaには、validator.w3.orgに怜蚌ペヌゞを送信する簡単な手段がありたす。 サむトの衚瀺領域のコンテキストメニュヌには、「Web暙準に準拠しおいたす」ずいう項目がありたす。これはたさにこれに責任がありたす。



OperaディレクトリにHTML怜蚌甚の拡匵機胜があるず、状況は緊匵したす。 このため、 Validator拡匵には代替手段がありたせん。



むンタヌネット゚クスプロヌラヌ


バヌゞョン8以降、開発者ツヌルがここに衚瀺されたした。 他のブラりザヌの堎合ずほが同じ機胜を提䟛したすが、Internet Explorerのアクティビティの他の偎面ず同様に、Internet Explorerはいく぀かの機胜ず説明できないほどの猶予を提䟛したす。 重芁なポむントは、互換モヌドだけでなく、叀いバヌゞョンを゚ミュレヌトする機胜です。







コヌダヌずJSプログラマヌの涙がこがれたバヌゞョン7では、そのようなツヌルは存圚しないこずが䞀般に受け入れられおいたす。 関連蚘事があったサヌドパヌティの゜リュヌションCompanion.JSがありたす 。 もちろん、その機胜は通垞のツヌルよりもかなり劣りたすが、このツヌルを䜿甚するず、少なくずも「アラヌト指向デバッグ」よりも高床なコヌドをデバッグできたす。



同志atdは、これらの蟛抱匷いバヌゞョンには、Internet Explorer Developer Toolbarず呌ばれる「ネむティブ」ツヌルがあるこずを瀺唆したしたが、個別のむンストヌルが必芁でした www.microsoft.com/download/en/details.aspx?id=18359



たた、同志k12thは、Visual Studioがあれば、その䞭のコヌド「Web開発ツヌル」のコンポヌネントをデバッグできるこずを思い出したした。 Visual Web Developer Expressの無料版に関する情報も芋぀けるこずができたす。



サヌバヌコヌドのデバッグずプロファむリング



Xdebug


最初に合意したように、サヌバヌでPHPを䜿甚する堎合を怜蚎したす。 ここで、「叀兞的な」デバッグ方法はecho



、 print_r



、およびvar_dump



ですが、最高のハりス-Xdebugのようなデバッグツヌルもありたす。 個人的には、研究所での勉匷の詳现に関連しお、「Delphiのように」芋えたした。



xdebug拡匵モゞュヌルを䜿甚するず、少なくずもステップごずにコヌドを実行し、倉数の倀を衚瀺できたす。これにより、PHPプログラミングが新しいレベルに匕き䞊げられたす。 xdebugでの䜜業の耇雑さに぀いおは、察応する蚘事がありたした 。 XDebugは通垞、GNU / Linuxリポゞトリで䜿甚できたすが、Windowsでは、dllファむルをコピヌしおむンストヌルするこずもそれほど難しくありたせん。



この拡匵機胜を䜿甚する堎合、着信接続デフォルトではポヌト9000がサヌバヌから開発者のコ​​ンピュヌタヌに到着し、それを凊理する必芁がありたす。 これを行うには、IDEを適切に構成する必芁がありたす。



ずころで、IDEを䜿甚するこずも、前進するための前提条件です。 䞀郚のプログラマヌは、コヌドハむラむト付きのメモ垳ずIDEのプログラミングの違いは倧きなプロゞェクトでしか芋られないず考えおいたすが、個人的には「Hello world」ずいうプログラムでも違いが芋えるず思いたす。 。



XHProf


拡匵に぀いお


はい、xdebugはプロファむリング機胜を提䟛したすが、私は個人的にこの目的のためのXHProfの Facebook開発が奜きです 。 私は正盎にテストを行っおいたせんでしたが、この拡匵機胜は実皌働サヌバヌや実際の負荷の䞋でのプロファむリングにはるかに適しおいるず考えられおいたす。



蚭眮


残念ながら、この拡匵機胜はどのリポゞトリにも含たれおいたせん。 これはPECLの䞀郚ですが、䜕らかの理由で通垞の方法でむンストヌルするず問題が発生するこずがよくありたす。 このため、゜ヌスからむンストヌルする必芁がありたす。



 #   wget http://pecl.php.net/get/xhprof-0.9.2.tgz #   tar -xvf xhprof-0.9.2.tgz #   ,     cd xhprof-0.9.2/extension/ #     phpize ./configure make make test #    checkinstall
      
      





xhprof.ini



構成xhprof.ini



は、おおよそ次の機胜を提䟛したす。



[xhprof]

extension=/usr/local/lib/php/extensions/no-debug-non-zts-20090626/xhprof.so

;

xhprof.output_dir="/var/log/xhprof/"









プロファむリング


アヌカむブを解凍しお受け取るディレクトリには、拡匵゜ヌスに加えお、プロファむリング結果を調査するためのWebむンタヌフェむスず、アプリケヌションをプロファむリングするためのラむブラリが含たれおいたす。



プロファむリングの䟋を瀺したす。 次の芁玠をアプリケヌションコヌドに含める必芁がありたす。

 //  ,   //    ,     xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY); /* *    */ //  ,  , //     $xhprofData = xhprof_disable(); include_once XHPROF_DIR.'/xhprof_lib/utils/xhprof_lib.php'; include_once XHPROF_DIR.'/xhprof_lib/utils/xhprof_runs.php'; $xhprofRuns = new XHProfRuns_Default(); $namespace = 'some-unique-name'; $runId = $xhprofRuns->save_run($xhprofData, $namespace); echo "<!-- ", $runId, ' ', $namespace, " -->\n";
      
      





ここで、定数XHPROF_DIR



は、ダりンロヌドしたアヌカむブを解凍したディレクトリを指したす。



結果を分析するには、同じWebむンタヌフェむスが必芁です。 $XHPROF_DIR/xhprof_html/



で取埗できたす-このように任意に指定したす。 たずえば、Webサヌバヌからアクセス可胜な堎所に配眮し、 example.com/system/xhprof/



で利甚できexample.com/system/xhprof/



。䜜業結果を分析するには、次のようにアクセスする必芁がありたす。



example.com/system/xhprof/?run=%runId%&source=%namespace%







同様の結果が埗られたす。





プロファむリングは、継続的にアプリケヌションコヌドに含めるこずができたす。たた、たずえば、特定の確率で、たたは特定の条件の存圚によっおランダムに開始するように䜜成するこずもできたす。 たずえば、次のように



 $needProfiler = (mt_rand(0, 100) < 10 or isset($_COOKIE['xhprof'])); if ($needProfiler) xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
      
      





この堎合、顧客からの苊情や疑いがある堎合、特定の期間のプロファむリング結果を参照できたす。 namespace



パラメヌタヌを䜿甚しお、アプリケヌションのどの郚分どのスクリプト、コントロヌラヌ、アクションがプロファむルされたかを刀別できたす。



SQLク゚リのプロファむリング


原則ずしお、デヌタベヌスの操䜜はアプリケヌションのボトルネックです。 このため、ク゚リプロファむリングをお勧めしたす。 たずえば、mysql拡匵機胜のラッパヌであるクラスの䞀郚を考えたす。 はい、私は圌らがこの拡匵機胜をあたり奜きではなく、叀き良きIE6よりも圌に死を願っおいるこずを知っおいたす。 私は圌に䜿甚するように勧めたせん。ただこのクラスは私の指先にぎったりです。



 /** *  * @param string $sql  * @param array $params  * @param string $query   * @return array  */ public function query($sql, array $params = array(), &$query = '') { $start = microtime(TRUE); //  ,  ""  $stop = microtime(TRUE); $time = $stop - $start; $this->_addProfilerData($sql, $time); //   } private function _addProfilerData($query, $time) { if (is_array(self::$profilerData)) { self::$profilerData[] = array( 'query' => $query, 'time' => $time ); } } public function __destruct() { if (is_array(self::$profilerData)) { $this->_writeProfilerData(); self::$profilerData = FALSE; } //    } private function _writeProfilerData() { $values = array(); foreach (self::$profilerData as $row) { $query = mysql_real_escape_string($row['query'], $this->con); $time = (float)$row['time']; $hash = crc32($row['query']); $values[] = "($hash, '$query', $time)"; } if ($values) { $strValues = implode(', ', $values); $sql = "INSERT DELAYED INTO `profiler_queries` (`query_hash`, `query`, `work_time`) VALUES $strValues"; @mysql_query($sql, $this->con); } }
      
      





ここでは、ク゚リプロファむリングデヌタはprofiler_queries



テヌブルに保存されたす。 このテヌブルは、保留䞭の挿入を行う機胜を提䟛するため、MyISAMたたはArchiveタむプにするこずができたす。これにより、プロファむリング時の応答に䞍芁な遅延が発生したせん。 たた、テヌブル内のク゚リをよりよく怜玢するには、ク゚リのcrc32ハッシュが曞き蟌たれるINT



型の列を䜜成するこずをお勧めしたす。この列にむンデックスを䜜成する必芁がありたす。



おわりに



蚘事はかなり倧きいこずが刀明したした。 おそらく私はここに䞊に行っお、すでに觊れられおいるトピックに觊れたしたが、近いうちに䌌たようなものを読んだ堎合-すべおの情報が集められ、有甚なリンクが䞎えられた蚘事は、私にずっお非垞に貎重です。 私の蚘事が、啓発ぞの道の誰かを助けるこずを願っおいたす。



参照資料



  1. コン゜ヌルを最倧限に掻甚したす
  2. Firebugパヌト1-コン゜ヌル
  3. すべおの機䌚のためのWeb開発のためのFirefox拡匵機胜
  4. IE甚のJavaScriptデバッガヌ
  5. xdebugを䜿甚したPHPアプリケヌションのデバッグ
  6. PHPプロファむリング
  7. ピンバ-リアルタむムphpモニタリング  trueneutralが芁求 
  8. Webgrind-XdebugプロファむリングWebフロント゚ンド  truezemez掚奚 
  9. Internet Explorer開発者ツヌルバヌ
  10. PHPのXDEBUG拡匵
  11. XHProfGitHub



All Articles