cURL yazma callback-i məhdud gövdə prefiksi saxlaya və həmin həddə çatdıqda ötürülməni dayandıra bilər. Bu qəsdən dayandırmanı digər yazma xətasından ayırmaq üçün öz flagınızdan istifadə edin.

Hədəf URL-i artıq qurulmuş yeni handle üçün:

$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-inin socks5h sxemi proxydən hədəf host adını həll etməyi xahiş edir. Göstərilən yeni handle ilə icazə verilən açıq hədəf testi üçün SOCKS5 proxy siyahısındakı hesabsız giriş həmin endpointi təmin edə bilər. TLS sertifikat yoxlaması normal parametrlərini saxlayır.

Boş olmayan chunk üçün sıfır qaytarmaq libcurl-ə callback-in verilən məlumatı qəbul etmədiyini bildirir. O, CURLE_WRITE_ERROR ilə dayanır. Burada yalnız həmin xəta ilə callback-in limitReached flagının birləşməsi gözlənilən sayılır.

Hədddən qısa cavab normal başa çatır. Həddə və ya ondan yuxarı olduqda prefix ən çox 32 KiB saxlayır, hətta son callback daha böyük chunk alsa da. Callback chunk ölçüləri dəyişir; tələb olunan buffer ölçüsü sabit uzunluqlu çağırışlara zəmanət deyil.

Bu, saxlanılan gövdəni məhdudlaşdırır, bağlantıda artıq buferlənmiş və ya ötürülmüş hər baytı deyil. Prefiks çoxbaytlı simvolun, JSON dəyərinin və ya HTML elementinin içində bitə bilər, ona görə onu tam parse edilə bilən sənəd hesab etməyin.

Əlaqəli məqalələr