Deter unha transferencia PHP cURL tras un prefixo do corpo
Manteña un prefixo limitado nunha función de escritura e recoñeza só o erro de escritura que esa función provoca deliberadamente.
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.