it-swarm.com.de

Richtige Methode zum Ausführen einer nicht zwischenspeicherbaren DB-Abfrage

Betrachten Sie den Code

function getNow() {
    global $wpdb;

    $now = $wpdb->get_var("SELECT NOW()");

    $wpdb->flush();

    return $now;
}

Ich verwende die obige Methode, um den Caching-Effekt der get_var-Methode zu vermeiden. Wenn ich die Funktion ausführe, erhalte ich immer das gleiche Ergebnis, z. B. .

echo getNow();
sleep(10);
echo getNow(); // Same result as above

Fragen:

  1. Gibt es eine bessere Möglichkeit, die obige Funktion zu schreiben, um den Caching-Effekt zu vermeiden?
  2. Warum $wpdb speichert NUR das letzte Ergebnis im Cache, aber nicht alle Ergebnisse der Abfragen in derselben Anforderung? Klingt für die letzte Abfrage wie ein bisschen übertrieben, oder?
1
Yoga

Ich bin mir nicht ganz sicher, wovon du sprichst, deshalb werde ich die Möglichkeiten erwähnen, die mir in den Sinn kommen.

Vielleicht das...

// Keep track of the last query for debug..
$this->last_query = $query;

http://core.trac.wordpress.org/browser/tags/3.5.2/wp-includes/wp-db.php#L1195

... ist es, wovon du sprichst. In diesem Fall wird in Ihrem Code nur die Methode flushNAME_ ausgeführt, mit der die Eigenschaften von $wpdb auf nulloder leere Werte zurückgesetzt werden. Es "verhindert" nichts und sieht auch nicht wirklich nach "Cachen" aus. Es fügt nur ein bisschen mehr Arbeit für PHP hinzu.

Oder vielleicht redest du darüber:

$this->result = @mysql_query( $query, $this->dbh );

http://core.trac.wordpress.org/browser/tags/3.5.2/wp-includes/wp-db.php#L1200

Aber ich weiß nicht, wie das als "Caching" gilt. Die Klasse muss die Ergebnisse abrufen und sie irgendwo ablegen . Das ist irgendwo $this->results;

Oder vielleicht redest du darüber:

Die Funktion get_var gibt eine einzelne Variable aus der Datenbank zurück. Obwohl nur eine Variable zurückgegeben wird, wird das gesamte Ergebnis der Abfrage zur späteren Verwendung zwischengespeichert. Gibt NULLzurück, wenn kein Ergebnis gefunden wird.

http://codex.wordpress.org/Class_Reference/wpdb#SELECT_a_Variable

Wenn Sie $wpdb->get_var("SELECT ID FROM {$wpdb->posts}"); ausprobiert haben, erhalten Sie eine Ergebnismenge, die den Zeilen in Ihrer Datenbank entspricht, aber get_var gibt nur ein Ergebnis zurück. Die anderen Ergebnisse sind noch im Objekt enthalten. Wenn Sie diese Ergebnisse (etwas) später benötigen, sind sie ohne weitere Abfrage verfügbar.

var_dump($wpdb->get_var("SELECT ID FROM {$wpdb->posts}"));
var_dump($wpdb->last_result);

Dies ist das einzige, was für mich wirklich als "Caching" gilt, obwohl ich es nie gebraucht habe. Es macht keinen wirklichen Unterschied bei Ihrer Abfrage, da diese ohnehin nur eine einzelne Zeile zurückgibt.


Gibt es eine bessere Möglichkeit, die obige Funktion zu schreiben?

Lassen Sie $wpdb->flush() weg, da ich die Vorteile in keinem der genannten Fälle wirklich sehe, insbesondere bei einer Abfrage wie "SELECT NOW()". Sobald die nächste Abfrage ausgeführt wird, wird $wpdb->flush trotzdem ausgeführt.

Und es gibt keinen Grund, die Variable $now und dann returnfestzulegen. Sofern Sie nicht beabsichtigen, die $now-Daten auf ihre Richtigkeit zu überprüfen, bevor returnname__en, müssen Sie returnname__en direkt aus der Abfrage heraus.

Warum zwischenspeichert $ wpdb NUR das letzte Ergebnis, aber nicht alle Ergebnisse der Abfragen in derselben Anforderung? Klingt für die letzte Abfrage wie ein bisschen übertrieben, oder?

Obwohl der Codex den Begriff "Cache" verwendet, bin ich mir nicht sicher, ob das meiste davon als "Cache" gilt, aber ich werde nicht darüber streiten. Es ist ein sehr minimaler Cache, wenn es überhaupt einer ist. Der "Cache" ist meist ein Artefakt der Funktionsweise von $wpdb.

Was das "Zwischenspeichern" jeder Abfrage in einer Anfrage betrifft, würde ich Speicherprobleme erwarten, wenn Sie dies versuchen - zumindest bei einigen Servern. Stellen Sie sich 4 oder 5 sehr große Ergebnismengen vor, die alle Speicher beanspruchen.

$wpdb ist eigentlich nur eine relativ einfache Schnittstelle zur Datenbank. Es ist praktisch, aber ich gehe davon aus, dass Sie es vielleicht so behandeln oder erwarten, dass es mehr ist als es ist. Es führt eine Abfrage aus, speichert einige Informationen für den eigenen Gebrauch und zum Debuggen und wenn eine andere Abfrage ausgeführt wird, abgesehen von den grundlegenden Verbindungsinformationen und einigen anderen grundlegenden Dingen wie Tastenkombinationen für Tabellennamen ($wpdb->posts), wird sie gelöscht und gestartet Über. Es ist kein globaler Abfrage-Manager oder Abfrage-Cache.

Basierend auf der aktualisierten Beschreibung lief ich:

function getNow() {
    global $wpdb;
    $now = $wpdb->get_var("SELECT NOW()");
    $wpdb->flush();
    return $now;
}

echo '<pre>';
echo getNow();
echo "\n";
sleep(10);
echo getNow(); // Same result as above
echo '</pre>';
die;

Und bekam:

2013-06-25 10:37:06
2013-06-25 10:37:16

Jedes Mal, wenn ich renne, unterscheiden sich die beiden Ergebnisse um zehn Sekunden.

Dann habe ich es mit der $wpdb->flush(); auskommentiert. Gleiche Ergebnisse. Dies ist sinnvoll, da $wpdb->flush(); ohnehin vor jeder Abfrage ausgeführt wird , wie Sie aus der Quelle ersehen können .

Der Effekt, den Sie sehen, ist nicht das Ergebnis des internen Vorgangs von $wpdb. Es ist ein anderer Caching-Mechanismus im Spiel.

1
s_ha_dum