Entwickler treten häufig auf Probleme mit der Leistung der Leistung auf Probleme mit der MySQLI -Erweiterung von PHP für Datenbankoperationen auf. Insbesondere in hohen Szenarien mit Parallelität und Hochfrequenzbetrieb ist es entscheidend, die richtige Funktion und ihre Aufruffrequenz auszuwählen. Dieser Artikel konzentriert sich auf die Funktion MySQLI_stmt :: Attr_get, um zu untersuchen, ob er für häufige Anrufe in hochfrequenten Operationen geeignet ist.
Mysqli_stmt :: attr_get ist eine Funktion in der MySQLI -Erweiterung, um ein vorbereitetes Attribut zu erhalten. Der Prototyp ist wie folgt:
mixed mysqli_stmt::attr_get(int $attribute)
Es akzeptiert eine Attributkonstante als Parameter, wie z .
Das Verwendungsszenario dieser Funktion wird hauptsächlich zum Überprüfen oder Konfigurieren des Anweisungsverhaltens verwendet, bevor die Anweisung Abfrage ausgeführt wird. Wenn Sie beispielsweise die maximale Feldlänge erhalten müssen, um dem Ergebnissatz genügend Speicher zuzuweisen, können Sie möglicherweise verwenden:
$stmt = $mysqli->prepare("SELECT name FROM users");
$stmt->attr_get(MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH);
In diesem Szenario ist Attr_get ein bequemes Werkzeug, um einige interne Eigenschaften des aktuellen Anweisungsobjekts zu erhalten.
Der Anruf von MySQLI_STMT :: attr_get selbst ist nicht teuer, da er nur einen einfachen Attributwert erhält und keine komplexe Logik- oder Datenbankkommunikation auslöst. Aber der Schlüssel zum Problem ist: In hohen Frequenzoperationen haben solche Funktionsaufrufe einen kumulativen Effekt?
PHP ist eine interpretierte Sprache, und jeder Funktionsaufruf hat eine bestimmte Kosten für die Erstellung von Kontext. Häufiger Anruf bei Attr_get in hoher Parallelität oder Schleifen verursacht keine Leistungsengpässe, sondern führt auch zu unnötigen Funktionsaufruf -Overhead.
Beispielsweise ist die folgende Codestruktur in Hochfrequenzschleifen offensichtlich ineffizient:
for ($i = 0; $i < 100000; $i++) {
$stmt = $mysqli->prepare("SELECT name FROM users WHERE id = ?");
$stmt->attr_get(MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH);
// ...
}
In diesem Szenario wird der Anruf bei Attr_get überflüssig, insbesondere wenn Sie sich nicht auf den Wert verlassen, den er für logisches Urteilsvermögen zurückgibt.
Obwohl Attr_get nicht direkt auf die Datenbank zugreift, ist die häufige Erstellung von Vorverarbeitungsanweisungen selbst Kosten. Meistens sollten Sie wirklich optimieren, die Wiederholung der Erklärung Vorbereitung ( prepe () ), nicht die Attr_get selbst.
Wenn Sie bei Hochfrequenzvorgängen Attr_get mehrmals anrufen, um denselben Attributwert zu erhalten, und der Wert nicht ändert, können Sie das Ergebnis vollständig zwischenspeichern.
$max_length_attr = $stmt->attr_get(MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH);
// Verwenden Sie direkt in nachfolgenden Operationen $max_length_attr,Anstatt es wiederholt anzurufen attr_get
Dieser Ansatz ist logisch sicher und effizienter.
Die MySQLi_stmt :: Attr_get -Funktion selbst ist leicht, aber in hohen Frequenzvorgängen ist es nicht die beste Praxis, sie häufig zu nennen, insbesondere in zwei Fällen:
Der Attributwert ändert sich nicht : Das Cache -Ergebnis sollte berücksichtigt werden;
In einer Schleife gerufen : Sie sollte aus der Schleife verschoben werden, oder die Programmstruktur sollte angepasst werden, um wiederholte Erwerbs zu vermeiden.
Bei der Optimierung der Leistung des PHP -Datenbankbetriebs sollte mehr Aufmerksamkeit auf die Datenbankverbindungsmanagement, die Multiplexing, die Netzwerklatenz und die E/A -Engpässe aufgestellt werden. Die Mikrooptimierung von Funktionsaufrufen ist das Vereisung auf dem Kuchen, sollte jedoch nicht überschattet werden.
Vor der Optimierung:
for ($i = 0; $i < 10000; $i++) {
$stmt = $mysqli->prepare("SELECT name FROM users WHERE id = ?");
$stmt->attr_get(MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH);
}
Nach der Optimierung:
$stmt = $mysqli->prepare("SELECT name FROM users WHERE id = ?");
$max_len = $stmt->attr_get(MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH);
for ($i = 0; $i < 10000; $i++) {
// verwenden $stmt Und $max_len
}
Durch die Reduzierung unnötiger Funktionsaufrufe kann Ihr Programm effizienter ausgeführt werden, insbesondere in stark gleichzeitigen Webdiensten, z .