Florian Herlings, freier Webentwickler aus Düsseldorf.

PHP Data Objects - Teil 2: Persistente Verbindungen

Um zu verstehen was persistente Verbindungen sind, schauen wir uns zuerst nicht-persistente Verbindungen an. Im „normalen“ Fall wird für jeden Request eines Users eine neue Verbindung zur Datenbank aufgebaut. Da das Aufbauen einer Verbindung der PHP-Runtime zur MySQL-Datenbank relativ Zeitaufwändig ist, wird hier einiges an Performance verschenkt. Abbildung: Ablauf ohne persistente Verbindung

Ablauf mit persistenter Verbindung

Der Ansatz von persistenten Verbindungen ist ein anderer: Statt bei jedem Request eine neue Verbindung aufzubauen, gibt man die Kontrolle über den Verbindungsaufbau an eine andere Instanz ab und fordert von dieser Instanz lediglich eine Verbindung an, wenn man diese braucht.

Diese Instanz (in diesem Fall die PHP-Runtime-Implementierung von PDO) kann dann einen Pool von Datenbank-Verbindungen aufbauen und auf Anfrage eine der Verbindungen zurückgeben. Der Vorteil ist, dass diese Verbindungen nur ein einziges Mal aufgebaut werden müssen und von da an auf Anfrage an eine PHP-Runtime übergeben werden können. Sobald die PHP-Runtime die Verbindung wieder frei gibt, kann diese Verbindung an eine andere Runtime übergeben werden. Abbildung: Ablauf mit persistenter Verbindung

Der Code

Der Unterschied zwischen dem Aufbau einer persistenten Verbindung und einer nicht persistenten Verbindung in PDO ist trivial und kann jederzeit „nachgerüstet“ werden.

Nicht-persistente Verbindung:

$connection = new PDO('mysql:host=localhost;dbname=test001', 'root', '');

Persistente Verbindung:

$connection = new PDO('mysql:host=localhost;dbname=test001', 'root', '', 
  array(PDO::ATTR_PERSISTENT => true));

Benchmarks

Die Gretchen-Frage ist „Was bringt mir das ganze?“. Und die Antwort ist schlicht, aber sehr relevant: Performance.

In einer kleinen Testreihe habe ich auf meinem Notebook (Core 2 Duo 1,66Ghz - 2,5GB RAM - Windows XP SP3) die Performance der verschiedenen Datenbank-Verbindungs-Arten geprüft. Die Tests wurden mit ApacheBench mit 25 nebenläufigen Threads und 10.000 Requests durchgeführt:

ab -c 25 -n 10000 [url]

Der Code, der verwendet wurde liegt auf GitHub. Falls mir jemand seine Testergebnisse zukommen lassen möchte, würde ich diese sehr gern hier veröffentlichen.

Die Ergebnisse sind mehr als beeindruckend: Während die drei nicht-persistenten Verbindungen in etwa gleich schnell laufen, schaffen persistente Verbindungen rund 65% mehr Requests pro Sekunde.

Requests pro Sekunde (mehr ist besser)

Lerne mehr auf CodeScouts.de