Start · Sprachen · PHP · Referenz · curl_pause

curl_pause

Funktion

Pausiert oder setzt eine aktive cURL-Verbindung (Senden und/oder Empfangen) fort.

seit PHP 5.5.0 Kategorie: http

Signatur

curl_pause(CurlHandle $handle, int $flags): int

Beschreibung

curl_pause() ermöglicht es, den Datenfluss einer laufenden cURL-Übertragung gezielt anzuhalten und später fortzusetzen. Dies ist besonders nützlich beim Streaming großer Datenmengen, bei denen der verarbeitende Code zwischenzeitlich mit dem Empfang nicht Schritt halten kann (Backpressure).

Das Verhalten wird über den Parameter flags gesteuert. Die Konstanten CURLPAUSE_RECV, CURLPAUSE_SEND und CURLPAUSE_ALL pausieren die jeweiligen Richtungen, während CURLPAUSE_RECV_CONT, CURLPAUSE_SEND_CONT und CURLPAUSE_CONT sie wieder fortsetzen. Die Konstanten lassen sich bitweise kombinieren.

Die Funktion ist primär im Zusammenspiel mit curl_multi_exec() sinnvoll, da eine pausierte Verbindung innerhalb eines Multi-Handle-Loops gezielt fortgesetzt werden kann, ohne andere laufende Transfers zu beeinflussen.

Wichtig: curl_pause() wirkt nur auf bereits laufende Transfers. Das Handle muss aktiv sein, d. h. der Transfer wurde bereits gestartet. Für serverseitige Push-Verbindungen (HTTP/2 Server Push) steht eine eigene Variante zur Verfügung.

Parameter

Name Typ Default Beschreibung
$handle Pflicht CurlHandle Ein aktives cURL-Handle, das zuvor mit curl_init() erzeugt wurde.
$flags Pflicht int Bitmaske aus einer oder mehreren der folgenden Konstanten: CURLPAUSE_RECV (Empfang pausieren), CURLPAUSE_RECV_CONT (Empfang fortsetzen), CURLPAUSE_SEND (Senden pausieren), CURLPAUSE_SEND_CONT (Senden fortsetzen), CURLPAUSE_ALL (alles pausieren), CURLPAUSE_CONT (alles fortsetzen).

Rückgabewert

Typ
int
Beschreibung
Gibt CURLE_OK (0) bei Erfolg zurück. Bei einem Fehler wird ein cURL-Fehlercode zurückgegeben (ungleich 0), der mit curl_error() näher beschrieben werden kann.

Beispiele

Empfang pausieren und fortsetzen (Multi-Handle)

<?php
$ch = curl_init('https://example.com/large-file.bin');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
curl_setopt($ch, CURLOPT_WRITEFUNCTION, function (CurlHandle $ch, string $data): int {
    // Simuliere eine Backpressure-Situation
    static $bytesReceived = 0;
    $bytesReceived += strlen($data);

    if ($bytesReceived > 1024 * 100) {
        // Nach 100 KB Empfang pausieren
        curl_pause($ch, CURLPAUSE_RECV);
    }

    echo "Empfangen: " . strlen($data) . " Bytes\n";
    return strlen($data);
});

$mh = curl_multi_init();
curl_multi_add_handle($mh, $ch);

$active = null;
do {
    $status = curl_multi_exec($mh, $active);
    curl_multi_select($mh);

    // Beispielhaft: nach kurzer Pause wieder fortsetzen
    usleep(50000);
    curl_pause($ch, CURLPAUSE_CONT);

} while ($active && $status === CURLM_OK);

curl_multi_remove_handle($mh, $ch);
curl_multi_close($mh);
curl_close($ch);

Einfaches Pausieren und Fortsetzen des Sendens

<?php
$ch = curl_init('https://httpbin.org/post');

curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_READFUNCTION, function (CurlHandle $ch, $fd, int $length): string {
    static $paused = false;
    if (!$paused) {
        // Senden nach erstem Aufruf pausieren
        curl_pause($ch, CURLPAUSE_SEND);
        $paused = true;
    }
    return '';
});

$mh = curl_multi_init();
curl_multi_add_handle($mh, $ch);

$active = null;
curl_multi_exec($mh, $active);

// Senden nach Verarbeitung fortsetzen
curl_pause($ch, CURLPAUSE_SEND_CONT);

do {
    curl_multi_exec($mh, $active);
    curl_multi_select($mh);
} while ($active);

$response = curl_multi_getcontent($ch);
echo $response;

curl_multi_remove_handle($mh, $ch);
curl_multi_close($mh);
curl_close($ch);

// Wichtig · Fallstricke

Hinweis: curl_pause() funktioniert nur während eines laufenden Transfers. Wird die Funktion aufgerufen, bevor der Transfer gestartet wurde oder nachdem er abgeschlossen ist, hat sie keine Wirkung.

Multi-Handle empfohlen: Da das Pausieren eines Transfers im Einzel-Handle-Betrieb (curl_exec()) kaum sinnvoll ist (der Transfer blockiert den Prozess), sollte curl_pause() ausschließlich mit curl_multi_exec() kombiniert werden.

Konstanten-Übersicht: CURLPAUSE_ALL entspricht CURLPAUSE_RECV | CURLPAUSE_SEND, CURLPAUSE_CONT entspricht CURLPAUSE_RECV_CONT | CURLPAUSE_SEND_CONT.