0

CakePHPの場合と同様に、Lithiumで実行されているクエリを表示する方法を知っていますか。何が実行されているのかがわかりやすくなるかもしれません。ページの下部に、実行されたクエリが表示されます。

![スクリーンショット] http://imgur.com/ffNfQ

回答を受け取った後、コントローラーにコードを追加しました。

Volumes::applyFilter('find', function($self, $params, $chain) {
      echo '<pre>===== self ======<br>';
      var_dump($self);
      echo '===== params ======<br>';
      var_dump($params);
      echo '===== chain ======<br>';
      var_dump($chain);
      echo '</pre>';
      $next = $chain->next($self, $params, $chain);

      return $next;

});

selfとparamsのすべてのvar_dumpに関する出力が得られますが、実行されるSQLクエリが必要です。

スクリーンショットを確認してくださいhttp://imgur.com/ffNfQ

4

3 に答える 3

1

@Nils が提案したように、Lithium フィルターを活用して、単純なクエリ ロガーを作成できます。ここで
作りました。クエリを環境上のファイルに記録します。ニーズに合わせて、 、および操作 をカスタマイズしてフィルターを追加できるはずです。readproduction
createupdatedelete

Cake のデバッグ ツールバーのようなすぐに使えるソリューションを探している場合は、li3_perfプロジェクトを確認してください: https://github.com/tmaiaroto/li3_perf

于 2012-11-10T10:47:16.997 に答える
1

これを行うには、ログに記録するクエリの種類にフィルターを追加します。それらをブートストラップ ファイルでグローバルに定義したり、コントローラで「ローカル」に定義したりできます。次の例では、クエリが適切に出力されませんが、データがある場合は非常に簡単に実行できます。

以下のコードは情報を取得する方法を示していますが、きれいな方法で出力していません。

   Connections::get('default')->applyFilter('read', function($self, $params, $chain) {

        echo "===========</br>\n"; 
        if (is_object($params['query'])){
            var_dump($params['query']->conditions());
        }
        else{
            echo 'Query: '; var_dump($params['query']); echo "</br>\n";
        }
        $time = microtime(true);

        $next = $chain->next($self, $params, $chain);

        $time = microtime(true) - $time;            
        echo "Results: " . count((array)$next) . "</br>\n";
        echo "Time: " . $time . "</br>\n";

        return $next;

    });

ヘッダーの前に印刷されるため、フィルターから直接データを送信すると、ページが役に立たなくなることに注意してください。ただし、フィルターのデータを出力する代わりに配列に保存すると、後でビューで使用できます。たとえば、この情報をページに追加するためのテンプレートを作成できます。

編集:更新されたコード

Edit2: 実行される正確な SQL を常に取得する方法を追加しました。を取得するには

Connections::get('default')->applyFilter('_execute', function($self, $params, $chain) {
    echo "SQL: " . $params['sql'] . "</br>\n";
    $time = microtime(true);

    $next =  $chain->next($self, $params, $chain);

    $time = microtime(true) - $time;
    $count = 0;
    while ($next->next())
     $count++;
    $next->rewind();
    echo "Count: " . $count . "</br>\n";        
    echo "Time: " . $time . "</br>\n";
    echo "=====================</br>\n";

    return $next;
});
于 2012-11-10T10:24:01.887 に答える
0

Nils と Mehdi によるすべての提案に基づいて、MongoDB を使用して Lithium で実行されたクエリの vardump または print_r() ではなく、クエリ結果のみを表示する新しいプラグインを作成しました。

実行されているものを見つけるのが本当に簡単になりました。

Github でプロジェクトを確認できます。

https://github.com/nilamdoc/li3_show

li3_show の出力

于 2012-11-12T20:38:40.133 に答える