In diesem Artikel erfahren Sie, wie Sie in PHP eine Verbindungspersistenz in der Datenbank erreichen. Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird für alle hilfreich sein.
Datenbankoptimierung hat für uns oberste Priorität in der Webentwicklung und in vielen Fällen programmieren wir tatsächlich für Datenbanken. Selbstverständlich werden alle Benutzervorgänge und -verhalten in Form von Daten gespeichert. Gibt es unter diesen Dingen etwas, das im Prozess der Datenbankverbindungserstellung optimiert werden kann? Die Antwort lautet natürlich: Ja, Sprachen wie Java verfügen über Verbindungspooleinstellungen, aber PHP verfügt in der normalen Entwicklung häufig über einen Verbindungspool, wenn es um Multithreading geht Bei jeder Ausführung wird eine neue Verbindung erstellt. Wie optimieren wir in diesem Fall die Datenverbindung?
Sehen wir uns zunächst die Definition der Datenbankverbindungspersistenz an.
Eine dauerhafte Datenbankverbindung ist eine Verbindung, die nicht geschlossen wird, wenn die Ausführung des Skripts abgeschlossen ist. Wenn eine dauerhafte Verbindungsanforderung empfangen wird. PHP prüft, ob bereits eine identische dauerhafte Verbindung besteht (die zuvor geöffnet wurde). Wenn sie existiert, wird diese Verbindung direkt verwendet; wenn sie nicht existiert, wird eine neue Verbindung aufgebaut. Die sogenannte „gleiche“ Verbindung bezieht sich auf eine Verbindung zum selben Host unter Verwendung desselben Benutzernamens und Passworts.
Leser, die die Arbeit eines Webservers und der verteilten Last nicht vollständig verstehen, verstehen möglicherweise die Rolle dauerhafter Verbindungen falsch. Insbesondere bieten dauerhafte Verbindungen weder die Möglichkeit, eine „Benutzersitzung“ auf derselben Verbindung einzurichten, noch bieten sie die Möglichkeit, effektiv eine Transaktion einzurichten. Tatsächlich bieten persistente Verbindungen streng genommen keine besondere Funktionalität, die nicht persistente Verbindungen nicht bieten können.
Das ist Verbindungspersistenz in PHP, aber es weist auch darauf hin, dass persistente Verbindungen keine besonderen Funktionen bieten, die nicht persistente Verbindungen nicht bieten können. Das ist sehr verwirrend. Heißt es nicht, dass diese Lösung die Leistung verbessern kann?
Ja, nach den in der obigen Definition genannten Sonderfunktionen zu urteilen, bringen dauerhafte Verbindungen keine neuen oder erweiterten Funktionen mit sich, aber ihr größter Nutzen besteht darin, die Effizienz zu verbessern, das heißt, die Leistung wird verbessert.
Wenn der Aufwand für die Herstellung einer Verbindung vom Webserver zum SQL-Server hoch ist (z. B. dauert es lange und verbraucht viel temporären Speicher), ist die dauerhafte Verbindung effizienter.
Das heißt, wenn die Verbindungskosten hoch sind, sind die Kosten für die Erstellung einer Datenbankverbindung höher und natürlich auch die Zeit länger. Nach der Verwendung dauerhafter Verbindungen führt jeder untergeordnete Prozess nur einmal in seinem Lebenszyklus einen Verbindungsvorgang aus, anstatt jedes Mal, wenn er eine Seite verarbeitet, eine Verbindungsanforderung an den SQL-Server zu stellen. Dies bedeutet, dass jeder untergeordnete Prozess seine eigene unabhängige dauerhafte Verbindung zum Server aufbaut.
Wenn beispielsweise 20 verschiedene untergeordnete Prozesse ein Skript ausführen, um eine dauerhafte SQL Server-Verbindung herzustellen, werden tatsächlich 20 verschiedene dauerhafte Verbindungen zum SQL Server hergestellt, eine für jeden Prozess.
Es gibt nicht viel zu sagen, vergleichen wir direkt anhand des Codes. Zuerst definieren wir eine statistische Funktion, um die aktuelle Millisekundenzeit zurückzugeben. Darüber hinaus müssen wir auch die Datenverbindungsparameter vorbereiten.
function getmicrotime() { list($usec, $sec) = explode(" ", microtime()); return ((float) $usec + (float) $sec); } $db = [ 'server' => 'localhost:3306', 'user' => 'root', 'password' => '', 'database' => 'blog_test', ];
Als nächstes verwenden wir zunächst gewöhnliches MySQL zum Testen.
$startTime = getmicrotime(); for ($i = 0; $i < 1000; $i++) { $mysqli = new mysqli($db["server"], $db["user"], $db["password"], $db["database"]); //持久连接 $mysqli->close(); } echo bcsub(getmicrotime(), $startTime, 10), PHP_EOL; // 6.5814000000
Im Prozess der Herstellung einer Datenbankverbindung über 1000 Zyklen haben wir mehr als 6 Sekunden aufgewendet. Als nächstes verwenden wir dauerhafte Verbindungen, um diese 1.000 Datenbankverbindungen zu erstellen. Fügen Sie einfach ein p: vor dem $host-Parameter von MySQL hinzu.
$startTime = getmicrotime(); for ($i = 0; $i < 1000; $i++) { $mysqli = new mysqli('p:' . $db["server"], $db["user"], $db["password"], $db["database"]); //持久连接 $mysqli->close(); } echo bcsub(getmicrotime(), $startTime, 10), PHP_EOL; // 0.0965000000
Aus der Perspektive der MySQL-Verbindung ist die Effizienzsteigerung sehr offensichtlich. Selbstverständlich bietet die PDO-Datenbankanbindung auch die Eigenschaft, eine dauerhafte Verbindung aufzubauen.
$startTime = getmicrotime(); for ($i = 0; $i < 1000; $i++) { $pdo = new PDO("mysql:dbname={$db['database']};host={$db['server']}", $db['user'], $db['password']); } echo bcsub(getmicrotime(), $startTime, 10), PHP_EOL; // 6.6171000000 $startTime = getmicrotime(); for ($i = 0; $i < 1000; $i++) { $pdo = new PDO("mysql:dbname={$db['database']};host={$db['server']}", $db['user'], $db['password'], [PDO::ATTR_PERSISTENT => true]); //持久连接 } echo bcsub(getmicrotime(), $startTime, 10), PHP_EOL; // 0.0398000000
Wenn Sie eine Verbindung im PDO-Modus herstellen, müssen Sie einen PDO::ATTR_PERSISTENT-Parameter angeben und ihn auf true setzen. Auf diese Weise wird auch die durch PDO aufgebaute Verbindung zu einer dauerhaften Verbindung.
Da die dauerhafte Verbindung der Datenbank so leistungsstark ist, warum nicht standardmäßig diese dauerhafte Verbindungsform verwenden, und müssen wir Parameter manuell hinzufügen, um dies zu erreichen? PHP-Entwickler haben sicherlich immer noch Bedenken.
Wenn die Anzahl der untergeordneten Prozesse mit dauerhaften Verbindungen das festgelegte Limit für die Anzahl der Datenbankverbindungen überschreitet, verursacht das System einige Probleme. Wenn die Datenbank ein Limit von 16 gleichzeitigen Verbindungen hat und im Falle einer ausgelasteten Sitzung 17 Threads versuchen, eine Verbindung herzustellen, kann ein Thread keine Verbindung herstellen. Wenn zu diesem Zeitpunkt ein Fehler im Skript auftritt, der das Schließen der Verbindung verhindert (z. B. eine Endlosschleife), sind die 16 Verbindungen zur Datenbank schnell betroffen.
Gleichzeitig erfordern auch Tabellensperren und Transaktionen Aufmerksamkeit.
Wenn das Skript bei Verwendung einer Datentabellensperre in einer dauerhaften Verbindung die Datentabellensperre aus irgendeinem Grund nicht aufheben kann, werden nachfolgende Skripte, die dieselbe Verbindung verwenden, dauerhaft blockiert, sodass der httpd-Dienst oder Datenbankdienst neu gestartet werden muss
In Wenn bei Verwendung der Transaktionsverarbeitung das Skript endet, bevor die Transaktionsblockierung erfolgt, wirkt sich die Blockierung auch auf das nächste Skript aus, das dieselbe Verbindung verwendet
Bei der Verwendung von Tabellensperren und Transaktionen ist es daher am besten, keine dauerhaften Datenbankverbindungen zu verwenden. Glücklicherweise können dauerhafte Verbindungen und gewöhnliche Verbindungen jederzeit ausgetauscht werden. Wir definieren zwei Verbindungsformen und verwenden in verschiedenen Situationen unterschiedliche Verbindungen, um ähnliche Probleme zu lösen.
Empfohlen: „Zusammenfassung der PHP-Interviewfragen 2021 (Sammlung)“ „php-Video-Tutorial“
Das obige ist der detaillierte Inhalt vonSo erreichen Sie Verbindungspersistenz in der Datenbank in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!