Start · Sprachen · PHP · Referenz · curl_upkeep

curl_upkeep

Funktion

Führt alle notwendigen Prüfungen zur Aufrechterhaltung einer aktiven cURL-Verbindung durch (z. B. HTTP/2-Ping-Frames senden).

seit PHP 8.2.0 Kategorie: http

Signatur

curl_upkeep(CurlHandle $handle): bool

Beschreibung

curl_upkeep() führt verbindungserhaltende Maßnahmen für ein gegebenes cURL-Handle durch. Aktuell betrifft dies vor allem HTTP/2-Verbindungen: Die Funktion sendet einen PING-Frame, um sicherzustellen, dass die Verbindung zum Server noch aktiv ist und nicht vom Netzwerk oder einem zwischengeschalteten Proxy stillschweigend getrennt wurde.

Die Funktion ist besonders nützlich bei langlebigen cURL-Handles (z. B. in persistenten Verbindungspools oder bei Keep-Alive-Verbindungen), bei denen längere Pausen zwischen den Anfragen auftreten können. Ohne regelmäßigen Upkeep könnten solche Verbindungen intern als geschlossen markiert werden, was zu Fehlern bei nachfolgenden Anfragen führt.

In typischen Szenarien – etwa in Worker-Prozessen, Daemons oder CLI-Skripten, die cURL-Verbindungen über längere Zeiträume offen halten – sollte curl_upkeep() in regelmäßigen Abständen aufgerufen werden, um die Verbindungsintegrität sicherzustellen.

Die Funktion gibt true zurück, wenn alle Upkeep-Maßnahmen erfolgreich durchgeführt wurden, und false bei einem Fehler. Sie ändert den Status des Handles nicht grundlegend und ist daher sicher zwischen zwei Anfragen aufrufbar.

Parameter

Name Typ Default Beschreibung
$handle Pflicht CurlHandle Ein gültiges cURL-Handle, das zuvor mit curl_init() erstellt wurde.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn alle Verbindungserhaltungs-Prüfungen erfolgreich waren, andernfalls false.

Beispiele

Verbindung in einem langlebigen Worker am Leben erhalten

<?php
$ch = curl_init('https://example.com/api/stream');
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

// Erste Anfrage ausführen
$result = curl_exec($ch);
echo "Erste Antwort erhalten.\n";

// Simuliere eine Pause (z. B. Verarbeitungszeit)
sleep(5);

// Verbindung aktiv halten
if (curl_upkeep($ch)) {
    echo "Upkeep erfolgreich – Verbindung ist noch aktiv.\n";
} else {
    echo "Upkeep fehlgeschlagen: " . curl_error($ch) . "\n";
}

// Zweite Anfrage mit demselben Handle
curl_setopt($ch, CURLOPT_URL, 'https://example.com/api/data');
$result2 = curl_exec($ch);
echo "Zweite Antwort erhalten.\n";

curl_close($ch);
Erste Antwort erhalten. Upkeep erfolgreich – Verbindung ist noch aktiv. Zweite Antwort erhalten.

Einsatz in einer periodischen Schleife (Daemon-Muster)

<?php
$ch = curl_init('https://example.com/api/status');
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$lastRequestTime = time();
$upkeepInterval = 30; // Sekunden

while (true) {
    $now = time();

    // Verbindung alle 30 Sekunden aktiv halten
    if (($now - $lastRequestTime) >= $upkeepInterval) {
        if (!curl_upkeep($ch)) {
            error_log('cURL-Upkeep fehlgeschlagen: ' . curl_error($ch));
        }
        $lastRequestTime = $now;
    }

    // Hier eigentliche Arbeit des Daemons ...
    sleep(1);

    // Abbruchbedingung für das Beispiel
    break;
}

curl_close($ch);
echo "Daemon-Schleife beendet.\n";
Daemon-Schleife beendet.

// Wichtig · Fallstricke

HTTP/2-spezifisch: Aktuell hat curl_upkeep() nur bei HTTP/2-Verbindungen eine messbare Wirkung (PING-Frame). Bei HTTP/1.x-Verbindungen ist der Aufruf zwar erlaubt, führt aber zu keinen zusätzlichen Aktionen.

Verfügbarkeit: Die Funktion steht erst ab PHP 8.2.0 zur Verfügung und erfordert eine libcurl-Version, die diese Funktionalität unterstützt (libcurl >= 7.62.0). Auf älteren Systemen ist sie nicht vorhanden.

Kein Ersatz für Fehlerbehandlung: curl_upkeep() garantiert nicht, dass die nächste Anfrage erfolgreich sein wird. Verbindungsfehler bei curl_exec() sollten weiterhin separat behandelt werden.