callback សរសេររបស់ cURL អាចរក្សាបុព្វបទតួដែលមានដែនកំណត់ ហើយបញ្ឈប់ការផ្ទេរនៅពេលដល់ដែនកំណត់នោះ។ ប្រើទង់ផ្ទាល់ខ្លួនរបស់អ្នកដើម្បីបែងចែកការបញ្ឈប់ដោយចេតនានោះពីការបរាជ័យសរសេរផ្សេងទៀត។

សម្រាប់ handle ថ្មីដែល 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);
}

គ្រោងការ socks5h នៃ URL ប្រូកស៊ីស្នើឱ្យប្រូកស៊ីដោះស្រាយឈ្មោះម៉ាស៊ីនគោលដៅ។ សម្រាប់ការសាកល្បងគោលដៅសាធារណៈដែលអនុញ្ញាតលើ handle ថ្មីដែលបានបង្ហាញ ការបញ្ចូលដោយគ្មានគណនីពីបញ្ជីប្រូកស៊ី SOCKS5អាចផ្តល់ endpoint នោះ។ ការផ្ទៀងផ្ទាត់វិញ្ញាបនបត្រ TLS រក្សាការកំណត់ធម្មតារបស់វា។

ការត្រឡប់សូន្យសម្រាប់ chunk ដែលមិនទទេ ប្រាប់ libcurl ថាcallback មិនបានទទួលយកទិន្នន័យដែលបានផ្តល់។ វាបញ្ឈប់ជាមួយ CURLE_WRITE_ERROR។ នៅទីនេះ មានតែការរួមគ្នានៃកំហុសនោះ និងទង់ limitReached របស់ callback ប៉ុណ្ណោះដែលចាត់ទុកជាការរំពឹងទុក។

ការឆ្លើយតបខ្លីជាងដែនកំណត់បញ្ចប់ជាធម្មតា។ នៅដែនកំណត់ ឬលើសពីនោះ prefix រក្សាបានច្រើនបំផុត 32 KiB ទោះបី callback ចុងក្រោយទទួល chunk ធំជាងក៏ដោយ។ ទំហំ chunk ប្រែប្រួល។ ទំហំ buffer ដែលស្នើមិនមែនជាការធានានៃការហៅប្រវែងថេរទេ។

នេះកំណត់តួដែលរក្សាទុក មិនមែនរាល់បៃដែលបាន buffer ឬផ្ទេររួចនៅលើការតភ្ជាប់ទេ។ បុព្វបទអាចបញ្ចប់នៅក្នុងតួអក្សរពហុបៃ តម្លៃ JSON ឬធាតុ HTML ដូច្នេះកុំសន្មតថាវាជាឯកសារពេញលេញដែលអាចញែកបាន។

អត្ថបទពាក់ព័ន្ធ