web-dev-qa-db-ja.com

Magentoですべてのクエリを印刷するにはどうすればよいですか?

Magentoですべてのクエリ文字列を表示することは可能ですか?どのクエリが実行されるかを確認するのが本当に好きです。

ありがとう

17
Moon

これがキャッチするかどうかは100%わかりませんすべてクエリですが、ほとんどの場合、クエリメソッドZend_Db_Adapter_Abstractqueryメソッドを実行します。

lib/Zend/Db/Adapter/Abstract.php

そのことを念頭に置いて、いくつかのデバッグステートメントを一時的に追加できます(安全のためにapp/code/local/Mageで作成したコピーに)

public function query($sql, $bind = array())
{
    // connect to the database if needed
    $this->_connect();

    // is the $sql a Zend_Db_Select object?
    if ($sql instanceof Zend_Db_Select) {
        if (empty($bind)) {
            $bind = $sql->getBind();
        }

        $sql = $sql->assemble();
    }
    echo "{$sql}\n<br />\n";
    var_dump($bind);

それらすべてをキャッチする必要がある場合は、MySQLレベルでこれを行う方がよいでしょう(これは、ホスト/ ITの状況によっては常に可能であるとは限りません)。

26
Alan Storm

Varien_Db_Adapter_Pdo_Mysqlで

Magento 1.4 : lib/varien/Db/Adapter/Pdo/Mysql.php

セットする

protected $_debug               = true;
protected $_logAllQueries       = true;

および(まだ存在しない場合)で定義されたフォルダーを作成します。

protected $_debugFile           = 'var/debug/sql.txt';

読み取り/書き込み許可を与える

53

Local.xmlの次のノードでZendSQLプロファイラーをアクティブ化します

<resources>
 <default_setup>
  <connection>
   <profiler>1</profiler>

次に、コードのどこかでプロファイラーにアクセスし、実行されたすべてのクエリに関する多くの情報を取得できます。

$profiler = Mage::getSingleton('core/resource')->getConnection('core_write')->getProfiler();

すべてのクエリを単純に出力するには:

print_r($profiler->getQueryProfiles());

index.phpの最後にこれらの2行を追加して、各ページの下部にあるすべてのクエリを表示できます。これにより、JSON応答を返すAJAXリクエストが破損することに注意してください。したがって、次のコードを使用して、クエリを出力する代わりにログに記録することを検討してください(ここでも、index.phpの最後に追加してください)。

$profiler = Mage::getSingleton('core/resource')->getConnection('core_write')->getProfiler();
Mage::log(print_r($profiler->getQueryProfiles(), true), null, 'queries.log', true);

次に、すべてのクエリがvar/log/queries.logにあります。

デバッグが終了したら、行を再度削除することを忘れないでください。

22

クエリは、アクティビティによって大幅に異なります。 MySQLサーバーをある程度制御できる場合は、クエリログをオンにしてみてください。

set global general_log = on

次に、SQLログを取得してクエリを確認できます。 Wordまたは警告として、Magentoはページの読み込みごとに数十のクエリを実行し、オブジェクトを保存するために数百のクエリを実行する傾向があります。

ありがとう、ジョー

6
Joseph Mastey
$collection->printLogQuery(true);
5

MySQLロギングをオンにすると、すべてのクエリトランザクションが確実にログに記録されます。ログをオンにする方法は次のとおりです。ログをオンにしてファイルにログを記録するには。以下をmy.cnfファイルまたはWindowsの場合はmy.iniファイルに配置し、MySQLを再起動します。

log = /path/to/your/logfile.log

次に、テーブルにログを記録する場合mysql.general_log、次のクエリを実行します。

SET GLOBAL log_output = 'TABLE';
SET GLOBAL general_log = 'ON';

ファイルにログを記録する場合は、次のコマンドを実行します。

SET GLOBAL log_output = "FILE"; 
SET GLOBAL general_log = 'ON';
1
s-hunter