Il proxy consegna i dati. Il vostro callback di scrittura restituisce il valore sbagliato. libcurl allora interrompe, e il codice circostante segnala un altro «errore di download tramite proxy».

Il callback deve indicare quanti byte ricevuti ha effettivamente gestito. Restituire un conteggio diverso segnala un errore. Per un sink di scrittura volutamente bloccante, un frammento può apparire così:

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;
    }
);

Ciò presuppone che l'applicazione esistente possieda l'handle e il sink di scrittura. Una scrittura fallita o parziale interrompe invece di affermare in silenzio che l'intero frammento è stato salvato. Un sink non bloccante richiede una progettazione adeguata di buffering e pausa/ripresa; il piccolo frammento non ne fornisce una.

Contate i byte, non i caratteri visualizzati. I dati possono essere binari o parte di una sequenza di testo multibyte. Una chiamata non è necessariamente una riga, un documento JSON o un messaggio del servizio.

L'analisi incrementale necessita di uno stato proprio tra le chiamate. Viceversa, accumulare ogni frammento fino al completamento può essere corretto per una risposta piccola e limitata, ma non è una politica di memoria per un flusso grande o senza fine.

Conservate il risultato del trasferimento e le prove dell'errore del callback. Un errore locale del disco o un'interruzione del parser può verificarsi dopo aver stabilito una rotta proxy valida. Se intendete fermarvi dopo un prefisso, contrassegnate separatamente questa interruzione volontaria del callback. Sostituire l'indirizzo del proxy non può riparare un sink che ha smesso di accettare dati.

Articoli correlati