PHP-cURL-Schreib-Callbacks müssen die Anzahl der verarbeiteten Bytes zurückgeben
Halten Sie den Byte-Zähl-Vertrag beim Verbrauchen von Proxy-Antwortblöcken ein und unterscheiden Sie einen lokalen Schreibfehler von einer fehlgeschlagenen Proxy-Verbindung.
Der Proxy liefert Daten. Ihr Schreib-Callback gibt den falschen Wert zurück. Daraufhin bricht libcurl ab, und der umgebende Code meldet einen weiteren „Proxy-Downloadfehler“.
Der Callback muss melden, wie viele empfangene Bytes er tatsächlich verarbeitet hat. Eine andere Anzahl zurückzugeben signalisiert einen Fehler. Für eine bewusst blockierende Schreibsenke kann ein Fragment so aussehen:
curl_setopt($handle, CURLOPT_PROXY, 'http://proxy.example:8080');
curl_setopt($handle, CURLOPT_WRITEFUNCTION,
function ($handle, $chunk) use ($sink) {
$written = fwrite($sink, $chunk);
return $written === false ? 0 : $written;
}
);Dies setzt voraus, dass die bestehende Anwendung das Handle und die Schreibsenke besitzt. Ein fehlgeschlagenes oder kurzes Schreiben bricht ab, statt stillschweigend zu behaupten, der ganze Block sei gespeichert. Eine nicht blockierende Senke braucht ein geeignetes Puffer- und Pause-/Fortsetzungsdesign; das kleine Fragment liefert keines.
Zählen Sie Bytes, nicht angezeigte Zeichen. Die Daten können binär oder Teil einer Mehrbyte-Textsequenz sein. Ein Callback ist nicht zwangsläufig eine Zeile, ein JSON-Dokument oder eine Nachricht des Dienstes.
Inkrementelles Parsen braucht einen eigenen Zustand über Callbacks hinweg. Umgekehrt kann das Ansammeln jedes Blocks bis zur Fertigstellung für eine kleine begrenzte Antwort richtig sein, ist aber keine Speicherstrategie für einen großen oder endlosen Strom.
Bewahren Sie das Übertragungsergebnis und die Belege für Callback-Fehler auf. Ein lokaler Datenträgerfehler oder Parser-Abbruch kann auftreten, nachdem eine gültige Proxy-Route aufgebaut wurde. Wenn Sie nach einem Präfix stoppen wollen, markieren Sie diesen bewussten Callback-Stopp getrennt. Das Ersetzen der Proxy-Adresse kann eine Senke nicht reparieren, die keine Daten mehr annimmt.