cURL राइट कॉलबॅक मर्यादित बॉडी प्रीफिक्स ठेवू शकतो आणि ती मर्यादा गाठताच ट्रान्सफर थांबवू शकतो. तो जाणूनबुजून केलेला थांबा दुसऱ्या राइट अपयशापासून वेगळा ओळखण्यासाठी तुमचा स्वतःचा फ्लॅग वापरा.

ज्याची लक्ष्य URL आधीच कॉन्फिगर झाली आहे अशा नवीन हँडलसाठी:

$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 योजना प्रॉक्सीला लक्ष्य होस्टनाव सोडवायला सांगते. दाखवलेल्या नवीन हँडलवर परवानगी असलेल्या सार्वजनिक लक्ष्याच्या चाचणीसाठी SOCKS5 प्रॉक्सी सूचीमधील खाते नसलेली नोंद तो एंडपॉइंट पुरवू शकते. TLS प्रमाणपत्र पडताळणी तिची नेहमीची सेटिंग्ज ठेवते.

रिकाम्या नसलेल्या चंकसाठी शून्य परत करणे libcurl ला सांगते की कॉलबॅकने दिलेला डेटा स्वीकारला नाही. तो CURLE_WRITE_ERROR सह थांबतो. येथे फक्त ती त्रुटी आणि कॉलबॅकचा limitReached फ्लॅग यांचा संयोग अपेक्षित मानला जातो.

मर्यादेपेक्षा लहान प्रतिसाद सामान्यपणे संपतो. मर्यादेवर किंवा त्याहून जास्त असल्यास prefix जास्तीत जास्त 32 KiB ठेवतो, शेवटच्या कॉलबॅकला मोठा चंक मिळाला तरी. चंकचे आकार बदलतात; मागितलेला बफर आकार स्थिर लांबीच्या कॉलची हमी नाही.

हे ठेवलेल्या बॉडीला मर्यादित करते, कनेक्शनवर आधीच बफर झालेल्या किंवा हस्तांतरित झालेल्या प्रत्येक बाइटला नाही. प्रीफिक्स बहु-बाइट अक्षर, JSON मूल्य किंवा HTML घटकाच्या आत संपू शकतो, म्हणून तो पूर्णपणे पार्स करता येणारा दस्तऐवज आहे असे गृहीत धरू नका.

संबंधित लेख