cURL жазу callback-і дененің шектелген префиксін сақтап, сол шекке жеткенде тасымалды тоқтата алады. Бұл әдейі тоқтатуды басқа жазу қатесінен ажырату үшін өз жалаушаңызды пайдаланыңыз.

Мақсатты URL-і әлдеқашан конфигурацияланған жаңа handle үшін:

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

Прокси URL-інің socks5h схемасы проксиден мақсатты хост атауын шешуді сұрайды. Көрсетілген жаңа handle-де рұқсат етілген жария мақсатты сынау үшін SOCKS5 прокси тізімінен тіркелгісіз жазба сол endpoint-ті бере алады. TLS сертификатын тексеру әдеттегі параметрлерін сақтайды.

Бос емес бөлік үшін нөл қайтару libcurl-ге callback берілген деректерді қабылдамағанын білдіреді. Ол CURLE_WRITE_ERROR-мен тоқтайды. Мұнда күтілетін нәрсе ретінде тек сол қате мен callback-тің limitReached жалаушасының қосындысы қарастырылады.

Шектен қысқа жауап әдеттегідей аяқталады. Шекте немесе одан жоғары prefix ең көбі 32 KiB сақтайды, тіпті соңғы callback үлкенірек бөлік алса да. Бөлік өлшемдері өзгереді; сұралған буфер өлшемі тұрақты ұзындықтағы шақыруларға кепілдік емес.

Бұл сақталған денені шектейді, байланыста әлдеқашан буферленген немесе тасымалданған әр байтты емес. Префикс көпбайтты таңбаның, JSON мәнінің немесе HTML элементінің ішінде аяқталуы мүмкін, сондықтан оны толық талданатын құжат деп есептемеңіз.

Қатысты мақалалар