2011-02-04 2 views
1

私は定期的に以下の状況に直面しています。私は何かをするPHPで構築された既存のシステムに取り組んでいます、実際はかなり多く、一般的にはたくさんのコードで構成されています。今私はいくつかの機能を拡張し、何かをデバッグし、システムがMySQL-DBとどのように対話するかを知る必要があります。どのリクエストがどのような順序で実行されるか。DBリクエストをインターセプトするには? (MySQL)

どのようにすべてのクエリを傍受できますか?データベースのxdebug_start_traceのようなもの。

EDIT:DBリクエストの集中処理はありません。そこにはあらゆる種類のリクエストがあります。だから私の質問はいくつかのログ機能に向けられています。そのようなものが有用であるかもしれないという常識であるので、基本的に存在するはずです。

EDIT2:mysql-deamonの再起動に依存するマリオソリューションを提案できません。その他の提案?

+0

すべてのMySQLデータベース接続を処理するクラスが1つありますか? –

+0

生のAPI関数を使用してレガシーコード上で実行することはできません。 –

+0

既存のコードがmysql_query()を直接使用する場合、最後の手段よりもrunkit_function_rename()を試して、すべての呼び出しをインターセプトするラッパー関数を定義することができます。あるいは、さらに悪い選択肢:netcat | tee | netcatを通してソケットを実行するか、ネットワークスニファを使う。 – mario

答えて

2

--log=fnパラメータを最初に入力して、mysqldを開始することで、MySQLの「一般クエリログ」を使用できます。 http://dev.mysql.com/doc/refman/5.1/en/query-log.html

+0

私は恐怖**これは私が探していたものだから問題を解決するが、私はDBにアクセスできず、このオプションで再起動できないため、適用できない -/ – Raffael

+0

@ Raffael1984:それが私ですそこには障害があると予想される。次に、アプリケーションの一時的な変更を行い、mysql_query( 'mysql_query_(')で検索と置換えを行い、信頼できるラッパー関数とカスタムログのサポートを追加します。 – mario

1

PDOを使用している場合は、クエリ文字列をログまたはエコーするように拡張できます。

<?php 
class PDODebug extends PDO 
{ 
    public function exec ($statement) 
    { 
     var_dump ($statement); // Or log to a file or use firePHP to log to the console 
     return (parent::exec ($statement)); 
    } 
    public function query ($statement) 
    { 
     var_dump ($statement); // Or log to a file or use firePHP to log to the console 
     return (parent::query ($statement)); 
    } 
} 
?> 

ここで、PDOを作成する新しいPDODebugを作成し、それを使って実行されたクエリがログに記録されます。別のOOデータベースインターフェイス(MySQLIなど)を使用している場合は、同様のことができるはずです。

mysql_ *関数のような非OO dbアクセス層を使用している場合は、mysql関数を使うたびにechoまたはvar_dumpなどを挿入する必要があります。

+0

システムが本当に巨大で、集中処理されていないDB処理がありますので、拡張クラスの解決方法はもっと複雑になります。 – Raffael

関連する問題