Start · Sprachen · PHP · Referenz · pg_connection_busy

pg_connection_busy

Funktion

Prüft, ob eine PostgreSQL-Verbindung gerade beschäftigt ist (d.h. eine asynchrone Abfrage läuft).

seit PHP 4.2.0 Kategorie: db

Signatur

pg_connection_busy(PgSql\Connection $connection): bool

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 true zurück, wenn die Verbindung gerade eine Abfrage verarbeitet.
  • Gibt false zurü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

Typ
bool
Beschreibung
Gibt 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);
1: Alice 2: Bob ...

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);
Anzahl: 1543 Anzahl: 872

// 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.