Signatur
Beschreibung
pg_connection_busy() gibt zurück, ob eine PostgreSQL-Datenbankverbindung aktuell mit der Verarbeitung einer asynchronen Abfrage beschäftigt ist. Die Funktion ist vor allem in Verbindung mit pg_send_query() und anderen nicht-blockierenden Abfragefunktionen nützlich, da diese Abfragen asynchron abgesetzt werden.
Wenn pg_send_query() eine Abfrage abschickt, kehrt die Funktion sofort zurück, ohne auf das Ergebnis zu warten. Mit pg_connection_busy() kann man anschließend in einer Schleife prüfen, ob die Verbindung noch beschäftigt ist, bevor man mit pg_get_result() das Ergebnis abruft.
Typischer Einsatz ist das nicht-blockierende Abfragemodell: Man schickt eine oder mehrere Abfragen ab und kann in der Zwischenzeit andere Aufgaben erledigen, bevor man das Ergebnis einfordert. Erst wenn pg_connection_busy() false zurückgibt, sollte pg_get_result() aufgerufen werden.
- Gibt
truezurück, wenn die Verbindung gerade eine Abfrage verarbeitet. - Gibt
falsezurück, wenn die Verbindung frei ist und bereit für neue Befehle oder zum Abruf von Ergebnissen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $connection Pflicht | PgSql\Connection | Eine PostgreSQL-Datenbankverbindung, die z.B. mit pg_connect() oder pg_pconnect() geöffnet wurde. Ab PHP 8.1 wird eine PgSql\Connection-Instanz erwartet; zuvor war es eine Ressource. |
Rückgabewert
true zurück, wenn die Verbindung gerade beschäftigt ist (eine asynchrone Abfrage noch läuft), andernfalls false.Beispiele
Asynchrone Abfrage mit Busy-Prüfung
<?php
$conn = pg_connect('host=localhost dbname=testdb user=postgres password=secret');
if (!$conn) {
die('Verbindung fehlgeschlagen');
}
// Asynchrone Abfrage abschicken
$sent = pg_send_query($conn, 'SELECT pg_sleep(1), id, name FROM users LIMIT 10');
if (!$sent) {
die('Abfrage konnte nicht gesendet werden');
}
// Warten, bis die Verbindung nicht mehr beschäftigt ist
while (pg_connection_busy($conn)) {
// Hier könnten andere Aufgaben erledigt werden
usleep(10000); // 10 ms warten
}
// Ergebnis abrufen
$result = pg_get_result($conn);
if ($result) {
while ($row = pg_fetch_assoc($result)) {
echo $row['id'] . ': ' . $row['name'] . PHP_EOL;
}
}
pg_close($conn);
Mehrere asynchrone Abfragen nacheinander auswerten
<?php
$conn = pg_connect('host=localhost dbname=testdb user=postgres password=secret');
if (!$conn) {
die('Verbindung fehlgeschlagen');
}
// Mehrere Abfragen in einer Zeichenkette abschicken
pg_send_query($conn, 'SELECT COUNT(*) AS cnt FROM orders; SELECT COUNT(*) AS cnt FROM users;');
// Alle Ergebnisse sequenziell abrufen
while (pg_connection_busy($conn)) {
usleep(5000);
}
while ($result = pg_get_result($conn)) {
$row = pg_fetch_assoc($result);
echo 'Anzahl: ' . $row['cnt'] . PHP_EOL;
pg_free_result($result);
}
pg_close($conn);
// Wichtig · Fallstricke
Wichtig: pg_connection_busy() sollte stets vor dem Aufruf von pg_get_result() geprüft werden, wenn zuvor eine asynchrone Abfrage mit pg_send_query() abgeschickt wurde. Ruft man pg_get_result() auf einer noch beschäftigten Verbindung auf, blockiert der Aufruf, bis das Ergebnis vorliegt – das entspricht dann nicht mehr dem nicht-blockierenden Modell.
Ab PHP 8.1 wurde der Verbindungstyp von einer Ressource auf eine PgSql\Connection-Instanz umgestellt. Code, der zuvor mit resource-Typprüfungen arbeitete, muss ggf. angepasst werden.
Für zeitkritische Anwendungen empfiehlt sich in Kombination mit pg_socket() und stream_select() ein echtes nicht-blockierendes I/O-Modell, anstatt aktiv mit usleep() zu pollen.