cURL rašymo callback funkcija gali išsaugoti apribotą kūno priešdėlį ir sustabdyti perdavimą, kai tik pasiekiama ši riba. Naudokite savo vėliavėlę, kad atskirtumėte šį sąmoningą sustabdymą nuo kitos rašymo klaidos.

Naujam handle, kurio tikslinis URL jau sukonfigūruotas:

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

Proxy URL socks5h schema prašo proxy išspręsti tikslinį hosto vardą. Leidžiamam viešos paskirties testui su parodytu nauju handle gali pasitarnauti įrašas be paskyros iš SOCKS5 proxy sąrašo. TLS sertifikato tikrinimas išlaiko įprastus nustatymus.

Grąžinus nulį už netuščią gabalą, libcurl sužino, kad callback funkcija nepriėmė pateiktų duomenų. Ji nutraukiama su CURLE_WRITE_ERROR. Čia numatoma laikoma tik šios klaidos ir callback funkcijos limitReached vėliavėlės kombinacija.

Trumpesnis nei riba atsakymas baigiasi įprastai. Pasiekus ribą ar ją viršijus, prefix saugo daugiausia 32 KiB, net jei paskutinė callback funkcija gauna didesnį gabalą. Gabalų dydžiai skiriasi; prašomas buferio dydis negarantuoja fiksuoto ilgio iškvietimų.

Tai riboja saugomą kūną, o ne kiekvieną jau į buferį įdėtą ar ryšiu perduotą baitą. Priešdėlis gali baigtis daugiabaičio simbolio, JSON reikšmės ar HTML elemento viduje, todėl nelaikykite jo visu analizuojamu dokumentu.

Susiję straipsniai