3

私は非常に大規模なPHPコードベース(主に手続き型)に取り組んでいます。これは、過去10年間、私の前に来た開発者によってまとめられており、現在、データベースの負荷が高くなっています。一部のファイルを覗くと、40〜60以上のMySQLクエリが実行されていることがわかります。この大きな不快なファイルで何に使用されているかを追跡するために時間を費やすと、クエリが実行され、結果が使用されなかったことがよくわかります。コードベースの問題領域を特定できれば、リファクタリングを開始できると思います。

さまざまな監査ツールに関するStackOverflowの投稿をたくさん見てきました。

ただし、スクリプト内のクエリの使用状況を分析するものはまだ見つかりません。たとえば、ファイルに含まれるSELECT、INSERT、およびUPDATEクエリの数。そしてもっと興味深いことに、それらのうちのいくつがループ構造の中に含まれていますか?基本的な問題のいくつかを特定するために、ダーティな再帰ファイル検索をすばやく作成しました。

   $it = new RecursiveDirectoryIterator($path);
   foreach(new RecursiveIteratorIterator($it) as $file) 
   {
      if(stristr($file, "/.") == false && stristr($file, "/..") == false)
  {
         $contents = file_get_contents($file);

         // Regular MySQL queries...indicative of SQL injection points
         $mysql_count = substr_count($contents, "mysql_query(");

         $select_count = substr_count($contents, 'SELECT ');
         $insert_count = substr_count($contents, 'INSERT INTO');
         $update_count = substr_count($contents, 'UPDATE ');

         if($mysql_count > 0 || $select_count > 0 || $insert_count > 0 || $update_count > 0)
         {
            $out[] = array('file' => $file, 
                           'mysql_count' => $mysql_count,
                           'select_count' => $select_count,
                           'insert_count' => $insert_count,
                           'update_count' => $update_count
                          );
         }

         $contents = null;
    }
}

var_dump($out);

ただし、ループ内には何も見つかりません。また、クエリを分析して、JOINSの高いしきい値が含まれているかどうかを確認することもできます。私はこのようなツールを書くことができますが、それがすでに存在するのになぜ車輪を再発明するのですか?


問題のある/高ストレス/非効率的なクエリを潜在的に持つ可能性のあるPHPファイルを識別するためのツールはありますか?

私の目標は、レガシー手続き型コードのリファクタリングが最も有益となるポイントを特定することです。

4

3 に答える 3

5

多くのクエリよりも悪いのは遅いクエリです。だから私はそれらを見つけようとします。

MySqlの遅いクエリログ機能を使用してそれを行うことができます:http: //dev.mysql.com/doc/refman/5.6/en/slow-query-log.html

于 2012-11-09T20:22:47.060 に答える
2

ここではおそらくべき乗則の分布があり、クエリのごく一部が問題の大部分を引き起こしています。@ficuscrが推奨するようにxdebugを使用すると、ここで最大の違反者を特定するのに役立ちます。

もう1つできることは、APDmysql_*などのプラグインを使用して実行時に関数を変更することです。変更した関数では、現在の情報やその他の関連情報(グローバル変数の状態など)をメモできます。__FILE____LINE__

于 2012-11-09T20:23:54.443 に答える
1

xdebugとそれがプロファイリングで何を達成できるかを調べることを提案すると します。もちろん、結果はOOPコードでよりわかりやすくなりますが、それは始まりかもしれません。これを使用すると、使用されたリソース/mysql_queryへの呼び出しの数を確認できるはずです。

あなたがリンクした記事はこれについて議論しているようです。これはどういうわけかあなたが探しているものではありませんか?繰り返しになりますが、SQLボトルネックを探している場合は、データベースサーバーの遅いクエリログから始めてください。

于 2012-11-09T20:18:57.883 に答える