Frage

Ich verwende die PDO-Schicht von PHP für den Datenzugriff in einem Projekt und habe mich darüber informiert und festgestellt, dass sie eine gute inhärente Unterstützung für dauerhafte DB-Verbindungen bietet.Ich frage mich, wann/ob ich sie verwenden sollte.Würde ich Leistungsvorteile in einer CRUD-lastigen App sehen?Gibt es Nachteile, die möglicherweise im Zusammenhang mit der Sicherheit zu berücksichtigen sind?

Falls es Ihnen wichtig ist: Ich verwende MySQL 5.x.

War es hilfreich?

Lösung

Sie könnten dies als groben „Regelsatz“ verwenden:

JA, verwenden Sie dauerhafte Verbindungen, wenn:

  • Es greifen nur wenige Anwendungen/Benutzer auf die Datenbank zu, d. h.Sie werden nicht zu 200 offenen (aber wahrscheinlich inaktiven) Verbindungen führen, da 200 verschiedene Benutzer auf demselben Host gemeinsam genutzt werden.
  • Die Datenbank läuft auf einem anderen Server, auf den Sie über das Netzwerk zugreifen
  • Eine (eine) Anwendung greift sehr oft auf die Datenbank zu

NEIN, verwenden Sie keine dauerhaften Verbindungen, wenn:

  • Ihre Anwendung muss nur 100 Mal pro Stunde auf die Datenbank zugreifen.
  • Sie haben viele Webserver, die auf einen Datenbankserver zugreifen
  • Sie verwenden Apache im Prefork-Modus.Für jeden untergeordneten Prozess wird eine Verbindung verwendet, was relativ schnell ansteigen kann.(über @Powerlord in den Kommentaren)

Die Verwendung dauerhafter Verbindungen ist erheblich schneller, insbesondere wenn Sie über ein Netzwerk auf die Datenbank zugreifen.Es macht keinen großen Unterschied, ob die Datenbank auf demselben Computer läuft, aber es ist immer noch etwas schneller.Allerdings ist die Verbindung – wie der Name schon sagt – persistent, d.h.Es bleibt geöffnet, auch wenn es nicht verwendet wird.

Das Problem dabei ist, dass MySQL in der „Standardkonfiguration“ nur 1000 parallele „offene Kanäle“ zulässt.Danach werden neue Verbindungen abgelehnt (Sie können diese Einstellung anpassen).Wenn Sie also beispielsweise 20 Webserver mit jeweils 100 Clients haben und jeder von ihnen nur einen Seitenzugriff pro Stunde hat, zeigt Ihnen eine einfache Rechnung, dass Sie 2000 parallele Verbindungen zur Datenbank benötigen.Das wird nicht funktionieren.

Ergo:Verwenden Sie es nur für Anwendungen mit vielen Anfragen.

Andere Tipps

Kurz gesagt: Meine Erfahrung zeigt, dass dauerhafte Verbindungen möglichst vermieden werden sollten.

Beachten Sie, dass mysql_close eine No-Operation (no-op) für Verbindungen ist, die mit mysql_pconnect erstellt werden.Dies bedeutet, dass eine dauerhafte Verbindung vom Client nicht nach Belieben geschlossen werden kann.Eine solche Verbindung wird vom mysqldb-Server geschlossen, wenn über einen Zeitraum von mehr als 100 m keine Aktivität auf der Verbindung stattfindet wait_timeout.Wenn wait_timeout Ist der Wert groß (z. B. 30 Minuten), kann der MySQL-Datenbankserver problemlos erreicht werden max_connections Grenze.In einem solchen Fall akzeptiert MySQL DB keine zukünftigen Verbindungsanfragen. Zu diesem Zeitpunkt beginnt Ihr Pager zu piepen.

Um ein Erreichen zu vermeiden max_connections Grenze, die Verwendung einer dauerhaften Verbindung erfordert eine sorgfältige Ausbalancierung der folgenden Variablen ...

  1. Anzahl der Apache-Prozesse auf einem Host
  2. Gesamtzahl der Hosts, auf denen Apache ausgeführt wird
  3. Variable „wait_timout“ im MySQL-Datenbankserver
  4. max_connections-Variable im MySQL-Datenbankserver
  5. Anzahl der Anfragen, die von einem Apache-Prozess bearbeitet werden, bevor er erneut erzeugt wird

Bitte verwenden Sie daher nach ausreichender Überlegung eine dauerhafte Verbindung.Möglicherweise möchten Sie komplexe Laufzeitprobleme nicht für einen kleinen Gewinn einladen, den Sie durch eine dauerhafte Verbindung erzielen.

Das Herstellen von Verbindungen zur Datenbank ist ein ziemlich kostspieliger Vorgang.Dauerhafte Verbindungen sind eine gute Idee.In der ASP.Net- und Java-Welt gibt es „Verbindungspooling“, was ungefähr dasselbe ist und auch eine gute Idee.

Meiner Meinung nach lautet die eigentliche Antwort auf diese Frage, was für Ihre App am besten funktioniert.Ich würde Ihnen empfehlen, Ihre App sowohl mit dauerhaften als auch mit nicht dauerhaften Verbindungen zu vergleichen.

Maggie Nelson @ Objektiv orientiert im August darüber gepostet und Robert Swarthout habe einen begleitenden Beitrag mit einigen harten Zahlen erstellt.Beide sind ziemlich gute Lektüre.

Meiner bescheidenen Meinung nach:

Wenn Sie PHP für die Webentwicklung verwenden, „leben“ die meisten Ihrer Verbindungen nur für die Lebensdauer der ausgeführten Seite.Eine dauerhafte Verbindung kostet Sie viel Overhead, da Sie sie in die Sitzung oder ähnliches einfügen müssen.

In 99 % der Fälle funktioniert eine einzelne nicht dauerhafte Verbindung, die am Ende der Seitenausführung unterbrochen wird, einwandfrei.

In den anderen 1 % der Fälle sollten Sie wahrscheinlich kein PHP für die App verwenden, und es gibt keine perfekte Lösung für Sie.

Ich wollte dieselbe Frage stellen, aber anstatt dieselbe Frage noch einmal zu stellen, füge ich einfach einige Informationen hinzu, die ich gefunden habe.

Erwähnenswert ist auch, dass die neuere MySQLi-Erweiterung nicht einmal die Option zur Verwendung persistenter Datenbankverbindungen enthält.

Ich verwende im Moment immer noch dauerhafte Verbindungen, habe aber vor, in naher Zukunft auf nicht-persistente Verbindungen umzusteigen.

Im Allgemeinen müssen Sie manchmal nicht persistente Verbindungen verwenden, und es ist schön, ein einziges Muster zu haben, das Sie auf das Design von Datenbankverbindungen anwenden können (solange die Verwendung persistenter Verbindungen in Ihrem Kontext relativ wenig Vorteile bietet).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top