Start · Sprachen · PHP · Referenz · pg_consume_input

pg_consume_input

Funktion

Liest alle eingehenden Daten von der PostgreSQL-Verbindung und gibt <code>true</code> bei Erfolg zurück.

seit PHP 4.3.0 Kategorie: db

Signatur

pg_consume_input(PgSql\Connection $connection): bool

Beschreibung

pg_consume_input() liest alle aktuell verfügbaren eingehenden Daten vom PostgreSQL-Server und speichert sie im internen Puffer. Die Funktion blockiert dabei nicht, sondern verarbeitet lediglich Daten, die bereits im Netzwerkpuffer der Verbindung warten.

Diese Funktion wird hauptsächlich im Zusammenhang mit asynchronen Abfragen verwendet — etwa nach pg_send_query(), pg_send_query_params() oder pg_send_execute(). Bevor man mit pg_get_result() ein Ergebnis abholt oder mit pg_get_notify() Benachrichtigungen abruft, sorgt pg_consume_input() dafür, dass der interne Puffer auf dem neuesten Stand ist.

In Kombination mit pg_connection_busy() lässt sich ein nicht-blockierender Polling-Loop realisieren: Solange die Verbindung als beschäftigt gilt, ruft man pg_consume_input() auf, um eingegangene Daten zu verarbeiten, bis der Server fertig ist.

Ohne den regelmäßigen Aufruf von pg_consume_input() kann es bei asynchronen Abfragen vorkommen, dass pg_connection_busy() fälschlicherweise true zurückgibt, obwohl der Server das Ergebnis bereits gesendet hat, es aber noch nicht verarbeitet wurde.

Parameter

Name Typ Default Beschreibung
$connection Pflicht PgSql\Connection Eine aktive PostgreSQL-Verbindungsinstanz, wie sie von pg_connect() oder pg_pconnect() zurückgegeben wird.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn die Operation erfolgreich war (auch wenn keine Daten verfügbar waren). Gibt false zurück, wenn ein Fehler aufgetreten ist, z. B. bei einer ungültigen Verbindung.

Beispiele

Nicht-blockierender Polling-Loop mit asynchroner Abfrage

<?php
$conn = pg_connect('host=localhost dbname=testdb user=postgres password=secret');
if (!$conn) {
    die('Verbindung fehlgeschlagen');
}

// Asynchrone Abfrage senden
if (!pg_send_query($conn, 'SELECT pg_sleep(1), 42 AS antwort')) {
    die('Abfrage konnte nicht gesendet werden');
}

// Nicht-blockierender Polling-Loop
while (pg_connection_busy($conn)) {
    // Eingehende Daten in den internen Puffer lesen
    if (!pg_consume_input($conn)) {
        die('Fehler beim Lesen der Eingabedaten: ' . pg_last_error($conn));
    }
    // Kurze Pause, um CPU-Last zu reduzieren
    usleep(10000); // 10 ms
}

$result = pg_get_result($conn);
if ($result) {
    $row = pg_fetch_assoc($result);
    echo 'Antwort: ' . $row['antwort'] . PHP_EOL;
    pg_free_result($result);
}

pg_close($conn);
?>
Antwort: 42

LISTEN/NOTIFY: Benachrichtigungen nicht-blockierend abrufen

<?php
$conn = pg_connect('host=localhost dbname=testdb user=postgres password=secret');
if (!$conn) {
    die('Verbindung fehlgeschlagen');
}

// Auf Kanal horchen
pg_query($conn, "LISTEN ereigniskanal");

echo 'Warte auf Benachrichtigungen ...' . PHP_EOL;

for ($i = 0; $i < 5; $i++) {
    // Eingabepuffer aktualisieren, bevor Benachrichtigungen abgefragt werden
    pg_consume_input($conn);

    $notify = pg_get_notify($conn, PGSQL_ASSOC);
    if ($notify !== false) {
        echo 'Benachrichtigung erhalten: ' . $notify['message'] .
             ' (PID: ' . $notify['pid'] . ')' . PHP_EOL;
    } else {
        echo 'Keine Benachrichtigung in Iteration ' . ($i + 1) . PHP_EOL;
    }

    sleep(1);
}

pg_close($conn);
?>
Warte auf Benachrichtigungen ... Keine Benachrichtigung in Iteration 1 ...

// Wichtig · Fallstricke

Wichtig bei asynchronen Abfragen: pg_consume_input() allein bestätigt nicht, dass ein vollständiges Abfrageergebnis verfügbar ist. Es liest lediglich verfügbare Bytes in den Puffer. Erst wenn pg_connection_busy() anschließend false zurückgibt, ist das Ergebnis vollständig eingegangen und kann mit pg_get_result() abgerufen werden.

Die Funktion ist nicht für blockierende, synchrone Abfragen mit pg_query() gedacht — dort wird der Puffer automatisch verwaltet.

Ab PHP 8.1 ist der Typ des Parameters connection offiziell PgSql\Connection; in älteren Versionen wurde eine Ressource (resource) übergeben.