Datenbankabfragen zählen und anzeigen


8

Ich suche nach einer Lösung, wie ich alle Abfragen auf einer WordPress-Site zählen und anzeigen kann. Weiß jemand, ob es ein gutes Plugin gibt?

Andernfalls wäre es eine Lösung, die Abfragen auf der Konsole zu überprüfen, da ich viel mit der Konsole arbeite.

Antworten:


9

Sie können diesen Codeblock in Ihre derzeit aktive WordPress-Themendatei einfügen functions.php:

function wpse_footer_db_queries(){
    echo '<!-- '.get_num_queries().' queries in '.timer_stop(0).' seconds. -->'.PHP_EOL;
}
add_action('wp_footer', 'wpse_footer_db_queries');

Der obige Codeblock rendert einen HTML-Kommentar in der Fußzeile Ihres Themas (vor </body>und </html>mit der Anzahl der Datenbankabfragen und dem Protokoll, das zum Abrufen benötigt wurde.


Das hilft mir. Gibt es auch eine Lösung, um die Abfragen mit ihrem Inhalt anzuzeigen? Wie so: SELECT * FROM wp_posts Danke
pkberlin

1
@derpiet See @toscho‚s Antwort .
Michael Ecklund

9

Hinzufügen …

define( 'SAVEQUERIES', TRUE );

… Zu dir wp-config.phpund inspiziere $wpdb->queriesbei shutdown. Dies ist der neueste Hook und der einzige , nach dem keine Abfragen ausgelöst werden. Außerdem funktioniert es wp-admin/auch.

Beispielcode als Plugin:

<?php
/**
 * Plugin Name: T5 Inspect Queries
 * Description: Adds a list of all queries at the end of each file.
 *
 * Add the following to your wp-config.php:

define( 'WP_DEBUG',         TRUE );
define( 'SAVEQUERIES',      TRUE );

 */

add_action( 'shutdown', 't5_inspect_queries' );

/**
 * Print a list of all database queries.
 *
 * @wp-hook shutdown
 * @return  void
 */
function t5_inspect_queries()
{
    global $wpdb;

    $list = '';

    if ( ! empty( $wpdb->queries ) )
    {
        $queries = array ();
        foreach ( $wpdb->queries as $query )
        {
            $queries[] = sprintf(
                '<li><pre>%1$s</pre>Time: %2$s sec<pre>%3$s</pre></li>',
                nl2br( esc_html( $query[0] ) ),
                number_format( sprintf('%0.1f', $query[1] * 1000), 1, '.', ',' ),
                esc_html( implode( "\n", explode(', ', $query[2] ) ) )
            );
        }

        $list = '<ol>' . implode( '', $queries ) . '</ol>';
    }

    printf(
        '<style>pre{white-space:pre-wrap !important}</style>
        <div class="%1$s"><p><b>%2$s Queries</b></p>%3$s</div>',
        __FUNCTION__,
        $wpdb->num_queries,
        $list
    );
}

Aktualisieren

Nachdem ich ein bisschen länger darüber nachgedacht habe, habe ich ein weiteres Plugin geschrieben, das besser für meine Bedürfnisse geeignet ist - und wahrscheinlich Ihr Plugin, wenn Sie die Konsole bevorzugen.

<?php
/**
 * Plugin Name: T5 Log Queries
 * Description: Writes all queries to '/query-log.sql'.
 * Plugin URI:  http://wordpress.stackexchange.com/a/70853/73
 * Version:     2012.11.04
 * Author:      Thomas Scholz
 * Author URI:  http://toscho.de
 * Licence:     MIT
 */

add_filter( 'query', 't5_log_queries' );

/**
 * Write the SQL to a file.
 *
 * @wp-hook query
 * @param   string $query
 * @return  string Unchanged query
 */
function t5_log_queries( $query )
{
    static $first = TRUE;
    // Change the path here.
    $log_path = apply_filters(
        't5_log_queries_path',
        ABSPATH . 'query-log.sql'
    );
    $header = '';

    if ( $first )
    {
        $time    = date( 'Y-m-d H:i:s' );
        $request = $_SERVER['REQUEST_URI'];
        $header  = "\n\n# -- Request URI: $request, Time: $time ------------\n";
        $first   = FALSE;
    }

    file_put_contents( $log_path, "$header\n$query", FILE_APPEND | LOCK_EX );

    return $query;
}

Verfolgen Sie die Datei mit tail(verfügbar unter Windows, wenn Git installiert ist ):

$ tail -f query-log.sql -n 50
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.