Signatur
Beschreibung
mysql_pconnect() öffnet eine persistente Verbindung zum MySQL-Server. Im Gegensatz zu mysql_connect() wird die Verbindung am Ende des Skripts nicht automatisch geschlossen, sondern bleibt im Verbindungspool des Webservers erhalten und kann vom nächsten Skript wiederverwendet werden. Das kann bei hoher Anfragelast die Verbindungskosten reduzieren.
Intern prüft PHP beim Aufruf, ob bereits eine offene persistente Verbindung mit denselben Parametern existiert. Ist das der Fall, wird diese Verbindung zurückgegeben, anstatt eine neue zu erstellen. Dadurch entfällt der TCP-Handshake und die MySQL-Authentifizierung für jede Anfrage.
Persistente Verbindungen können jedoch Probleme verursachen: Zustand wie offene Transaktionen, gesetzte Variablen oder gelockte Tabellen kann von einem vorherigen Skript übrig bleiben. Außerdem belegen sie Datenbankverbindungen dauerhaft, was bei vielen Worker-Prozessen zu Ressourcenengpässen führt. Moderne Anwendungen verwenden stattdessen PDO mit PDO::ATTR_PERSISTENT.
Wichtig: Die gesamte mysql_*-Erweiterung ist seit PHP 5.5.0 als veraltet markiert und wurde in PHP 7.0.0 vollständig entfernt. Für neue Projekte sollte ausschließlich mysqli oder PDO verwendet werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $server | string | ini_get('mysql.default_host') | Hostname oder IP-Adresse des MySQL-Servers, optional mit Port (hostname:port) oder Socket-Pfad (:/pfad/zum/socket). |
| $username | string | ini_get('mysql.default_user') | MySQL-Benutzername für die Authentifizierung. |
| $password | string | ini_get('mysql.default_password') | Passwort des MySQL-Benutzers. |
| $client_flags | int | 0 | Bitmaske von Client-Flags wie MYSQL_CLIENT_SSL, MYSQL_CLIENT_COMPRESS oder MYSQL_CLIENT_IGNORE_SPACE. |
Rückgabewert
mysql_*-Funktionen verwendet werden kann. Im Fehlerfall wird false zurückgegeben.Beispiele
Persistente Verbindung herstellen und Abfrage ausführen (PHP < 7)
<?php
// Nur für PHP 5.x — mysql_* ist in PHP 7+ entfernt
$link = mysql_pconnect('localhost', 'db_user', 'geheimes_passwort');
if ($link === false) {
die('Verbindung fehlgeschlagen: ' . mysql_error());
}
if (!mysql_select_db('meine_datenbank', $link)) {
die('Datenbank nicht gefunden: ' . mysql_error($link));
}
$result = mysql_query('SELECT id, name FROM benutzer LIMIT 5', $link);
while ($row = mysql_fetch_assoc($result)) {
echo $row['id'] . ': ' . htmlspecialchars($row['name']) . PHP_EOL;
}
mysql_free_result($result);
// Verbindung bleibt offen (persistent) — kein mysql_close() nötig
Moderner Ersatz mit PDO und persistenter Verbindung
<?php
// Empfohlene Alternative mit PDO (ab PHP 5.1)
$options = [
PDO::ATTR_PERSISTENT => true, // persistente Verbindung
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
];
try {
$pdo = new PDO(
'mysql:host=localhost;dbname=meine_datenbank;charset=utf8mb4',
'db_user',
'geheimes_passwort',
$options
);
$stmt = $pdo->query('SELECT id, name FROM benutzer LIMIT 5');
foreach ($stmt as $row) {
echo $row['id'] . ': ' . htmlspecialchars($row['name']) . PHP_EOL;
}
} catch (PDOException $e) {
// Fehlermeldung niemals direkt ausgeben (Sicherheitsrisiko)
error_log($e->getMessage());
die('Datenbankfehler aufgetreten.');
}
// Wichtig · Fallstricke
Deprecation und Entfernung: Die mysql_*-Erweiterung wurde in PHP 5.5.0 als veraltet erklärt (E_DEPRECATED-Warnung) und in PHP 7.0.0 vollständig entfernt. Jeglicher Code, der diese Erweiterung nutzt, muss auf mysqli oder PDO migriert werden.
Sicherheit: Persistente Verbindungen teilen Datenbankzustand zwischen verschiedenen HTTP-Anfragen. Offene Transaktionen, gesetzte Session-Variablen (SET @var) oder aktive Locks können unbeabsichtigt an folgende Skripte weitergegeben werden und zu schwer nachvollziehbaren Fehlern oder Sicherheitslücken führen.
Ressourcenverbrauch: Jeder PHP-Worker-Prozess hält eine eigene persistente Verbindung. Bei 100 Worker-Prozessen entstehen so 100 dauerhaft offene MySQL-Verbindungen, selbst wenn keine Anfragen aktiv verarbeitet werden. Dies kann den max_connections-Grenzwert von MySQL erschöpfen.
SQL-Injection: mysql_pconnect() bietet keine Prepared Statements. Benutzereingaben müssen zwingend mit mysql_real_escape_string() maskiert werden — was fehleranfällig ist. PDO und mysqli mit Prepared Statements sind die deutlich sicherere Wahl.