Start · Sprachen · PHP · Referenz · pg_flush

pg_flush

Funktion

Sendet alle noch ausstehenden Ausgabedaten aus dem internen Puffer an den PostgreSQL-Server über die angegebene Verbindung.

seit PHP 5.0.0 Kategorie: db

Signatur

pg_flush(PgSql\Connection $connection): int|bool

Beschreibung

pg_flush() versucht, alle bisher gepufferten, aber noch nicht gesendeten Abfragedaten über die PostgreSQL-Verbindung zum Server zu übertragen. Dies ist vor allem dann relevant, wenn Abfragen asynchron (z. B. mit pg_send_query()) abgeschickt werden und sichergestellt werden soll, dass der Server die Daten tatsächlich empfangen hat.

Im normalen synchronen Betrieb, bei dem pg_query() verwendet wird, ist pg_flush() in der Regel nicht notwendig, da die Daten automatisch vollständig gesendet werden. Bei asynchronen Abläufen jedoch kann es vorkommen, dass der interne Sendepuffer noch Daten enthält, die noch nicht übertragen wurden. In diesem Fall sollte pg_flush() in einer Schleife aufgerufen werden, bis alle Daten gesendet wurden.

Der Rückgabewert ermöglicht eine differenzierte Fehlerbehandlung: 0 bedeutet, dass noch Daten im Puffer sind und erneut gespült werden muss; 1 steht für Erfolg; false zeigt einen Fehler an. Dies macht die Funktion besonders nützlich in nicht-blockierenden oder ereignisgesteuerten Architekturen.

Parameter

Name Typ Default Beschreibung
$connection Pflicht PgSql\Connection Eine aktive PostgreSQL-Datenbankverbindung, die mit pg_connect() oder pg_pconnect() geöffnet wurde. Ab PHP 8.1 ist dies ein PgSql\Connection-Objekt (zuvor eine Ressource).

Rückgabewert

Typ
int|bool
Beschreibung
Gibt 1 zurück, wenn alle Daten erfolgreich gesendet wurden; 0, wenn noch Daten im Puffer verbleiben und pg_flush() erneut aufgerufen werden muss; false bei einem Fehler (z. B. wenn die Verbindung unterbrochen ist).

Beispiele

Asynchrone Abfrage mit pg_flush in einer Schleife

<?php
$conn = pg_connect('host=localhost dbname=testdb user=postgres password=secret');

if (!$conn) {
    die('Verbindung fehlgeschlagen');
}

// Asynchrone Abfrage senden
$result = pg_send_query($conn, 'SELECT * FROM orders WHERE status = \'pending\'');

if (!$result) {
    die('Abfrage konnte nicht gesendet werden: ' . pg_last_error($conn));
}

// Sicherstellen, dass alle Daten wirklich gesendet wurden
$flushStatus = pg_flush($conn);
while ($flushStatus === 0) {
    // Noch Daten im Puffer — erneut versuchen
    $flushStatus = pg_flush($conn);
}

if ($flushStatus === false) {
    die('Fehler beim Senden der Daten: ' . pg_last_error($conn));
}

// Ergebnis abrufen
$res = pg_get_result($conn);
while ($row = pg_fetch_assoc($res)) {
    echo 'Bestellung #' . $row['id'] . ': ' . $row['total'] . ' EUR' . PHP_EOL;
}

pg_close($conn);
Bestellung #42: 149.99 EUR Bestellung #43: 89.50 EUR

Verwendung in nicht-blockierendem I/O mit Stream-Prüfung

<?php
$conn = pg_connect('host=localhost dbname=testdb user=postgres password=secret');

if (!$conn) {
    die('Verbindung fehlgeschlagen');
}

// Verbindung auf nicht-blockierend setzen
pg_send_query($conn, 'INSERT INTO logs (message) VALUES (\'System gestartet\')');

// Flush mit Fehlerbehandlung
$attempts = 0;
do {
    $status = pg_flush($conn);
    if ($status === false) {
        echo 'Fehler beim Senden: ' . pg_last_error($conn) . PHP_EOL;
        break;
    }
    $attempts++;
    if ($attempts > 100) {
        echo 'Zu viele Flush-Versuche, Abbruch.' . PHP_EOL;
        break;
    }
} while ($status === 0);

if ($status === 1) {
    echo 'Daten erfolgreich gesendet nach ' . $attempts . ' Versuch(en).' . PHP_EOL;
}

pg_close($conn);
Daten erfolgreich gesendet nach 1 Versuch(en).

// Wichtig · Fallstricke

Wichtig für asynchrone Abläufe: Bei Verwendung von pg_send_query(), pg_send_query_params() oder anderen nicht-blockierenden Funktionen ist es essenziell, pg_flush() in einer Schleife zu verwenden und auf den Rückgabewert 0 zu reagieren, da sonst Daten im Puffer verbleiben können und der Server die Abfrage möglicherweise nie empfängt.

Ab PHP 8.1 wurde der Typ des $connection-Parameters von einer Ressource (resource) auf das Objekt PgSql\Connection umgestellt. Code, der noch mit Ressourcen arbeitet, sollte entsprechend angepasst werden.

In synchronen Szenarien mit pg_query() ist pg_flush() üblicherweise überflüssig und muss nicht manuell aufgerufen werden.