Unha función de escritura de cURL pode reter un prefixo limitado do corpo e deter a transferencia en canto se alcanza ese límite. Use o seu propio indicador para distinguir esa parada deliberada doutro fallo de escritura.

Para un handle novo cuxo URL de destino xa está configurado:

$limit = 32768;
$prefix = '';
$limitReached = false;

curl_setopt_array($ch, [
    CURLOPT_PROXY => 'socks5h://proxy.example.net:1080',
    CURLOPT_HEADER => false,
    CURLOPT_WRITEFUNCTION => function ($handle, $chunk)
        use (&$prefix, &$limitReached, $limit) {
        $remaining = $limit - strlen($prefix);
        $prefix .= substr($chunk, 0, $remaining);

        if (strlen($prefix) >= $limit) {
            $limitReached = true;
            return 0;
        }

        return strlen($chunk);
    },
]);

$result = curl_exec($ch);
$error = curl_errno($ch);

$expectedStop = $limitReached && $error === CURLE_WRITE_ERROR;
if ($result === false && !$expectedStop) {
    throw new RuntimeException(curl_error($ch), $error);
}

O esquema socks5h do URL do proxy pide ao proxy que resolva o nome de host de destino. Para unha proba permitida contra un destino público no handle novo mostrado, unha entrada sen conta da lista de proxies SOCKS5 pode fornecer ese endpoint. A verificación do certificado TLS mantén os seus axustes normais.

Devolver cero para un fragmento non baleiro indica a libcurl que a función non aceptou os datos subministrados. Aborta con CURLE_WRITE_ERROR. Aquí só se considera esperada a combinación dese erro e do indicador limitReached da función.

Unha resposta máis curta ca o límite remata con normalidade. No límite ou por riba, prefix retén como máximo 32 KiB aínda que a función final reciba un fragmento maior. Os tamaños dos fragmentos varían; un tamaño de búfer solicitado non garante chamadas de lonxitude fixa.

Isto limita o corpo retido, non cada byte xa almacenado en búfer ou transferido na conexión. O prefixo pode rematar dentro dun carácter multibyte, dun valor JSON ou dun elemento HTML, así que non supoña que é un documento completo que se poida analizar.

Artigos relacionados