Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Einführung in die Persistenz von Datenbankverbindungen in PHP

Detaillierte Einführung in die Persistenz von Datenbankverbindungen in PHP

醉折花枝作酒筹
醉折花枝作酒筹nach vorne
2021-06-04 17:28:471759Durchsuche

Dieser Artikel gibt Ihnen eine detaillierte Einführung in die Datenbankverbindungspersistenz in PHP. Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird für alle hilfreich sein.

Detaillierte Einführung in die Persistenz von Datenbankverbindungen in PHP

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?

Was ist Datenbankverbindungspersistenz?

Werfen wir zunächst einen Blick auf die Definition der Datenbankverbindungspersistenz.

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 diese Verbindung vorhanden ist, wird sie direkt verwendet. Wenn sie nicht vorhanden ist, wird eine neue Verbindung hergestellt. 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?

Was nützt die Verbindungspersistenz?

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.

Effizienzvergleich

Vergleichen wir ohne weitere Umschweife 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(&#39;p:&#39; . $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[&#39;database&#39;]};host={$db[&#39;server&#39;]}", $db[&#39;user&#39;], $db[&#39;password&#39;]);
}
echo bcsub(getmicrotime(), $startTime, 10), PHP_EOL;
// 6.6171000000

$startTime = getmicrotime();
for ($i = 0; $i < 1000; $i++) {
    $pdo = new PDO("mysql:dbname={$db[&#39;database&#39;]};host={$db[&#39;server&#39;]}", $db[&#39;user&#39;], $db[&#39;password&#39;], [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.

Hinweis

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

在使用事务处理时,如果脚本在事务阻塞产生前结束,则该阻塞也会影响到使用相同连接的下一个脚本

所以,在使用表锁及事务的情况下,最好还是不要使用持久化的数据库连接。不过好在持久连接和普通连接是可以在任何时候互换的,我们定义两种连接形式,在不同的情况下使用不同的连接即可解决类似的问题。

总结

事物总有两面性,持久连接一方面带来了效率的提升,但另一方面也可能带来一些业务逻辑上的问题,而且这种问题如果在不了解持久连接的机制的情况下会非常难排查。因此,在日常开发中我们一定要在了解相关功能特性的情况下再选择适合的方式来完成所需要的功能开发。

测试代码:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202004/source/PHP%E4%B8%AD%E7%9A%84%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5%E6%8C%81%E4%B9%85%E5%8C%96.php

推荐学习:php视频教程

Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in die Persistenz von Datenbankverbindungen in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen