Ustavljanje prenosa PHP cURL po predponi telesa
Ohranite omejeno predpono v povratnem klicu za pisanje in prepoznajte samo napako pisanja, ki jo ta povratni klic namerno povzroči.
Povratni klic za pisanje cURL lahko ohrani omejeno predpono telesa in ustavi prenos takoj, ko je ta meja dosežena. Uporabite svojo zastavico, da to namerno ustavitev ločite od druge napake pisanja.
Za nov handle, katerega ciljni URL je že nastavljen:
$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);
}
Shema socks5h v URL-ju proxyja zahteva, da proxy razreši ime ciljnega gostitelja. Za dovoljen preizkus javnega cilja na prikazanem novem handle lahko vnos brez računa s seznama proxyjev SOCKS5 zagotovi to končno točko. Preverjanje potrdila TLS ohrani običajne nastavitve.
Vračanje ničle za neprazen kos pove libcurlu, da povratni klic ni sprejel poslanih podatkov. Prenos se prekine z CURLE_WRITE_ERROR. Tu se kot pričakovana šteje le kombinacija te napake in zastavice limitReached povratnega klica.
Odziv, krajši od meje, se konča običajno. Na meji ali nad njo prefix hrani največ 32 KiB, tudi če zadnji povratni klic prejme večji kos. Velikosti kosov se razlikujejo; zahtevana velikost medpomnilnika ne obljublja klicev s fiksno dolžino.
To omejuje shranjeno telo, ne pa vsakega bajta, ki je že v medpomnilniku ali prenesen po povezavi. Predpona se lahko konča znotraj večbajtnega znaka, vrednosti JSON ali elementa HTML, zato ne domnevajte, da je to celoten dokument, ki ga je mogoče razčleniti.