Signatur
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
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);
?>
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);
?>
// 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.