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

proxy URL ၏ socks5h အစီအစဉ်သည် proxy ကို ပစ်မှတ် host အမည်ကို ဖြေရှင်းရန် တောင်းဆိုသည်။ ပြသထားသော handle အသစ်တွင် ခွင့်ပြုထားသော အများပြည်သူ ပစ်မှတ် စမ်းသပ်မှုအတွက် SOCKS5 proxy စာရင်းမှ အကောင့်မလိုသော အချက်အလက်က ထို endpoint ကို ပေးနိုင်သည်။ TLS လက်မှတ် စစ်ဆေးခြင်းသည် ပုံမှန် ဆက်တင်များကို ထိန်းထားသည်။

မဟာသော အပိုင်းအတွက် သုည ပြန်ပေးခြင်းသည် libcurl ကို callback သည် ပေးထားသော ဒေတာကို လက်မခံခဲ့ပါ ဟု အသိပေးသည်။ ၎င်းသည် CURLE_WRITE_ERROR ဖြင့် ရပ်တန့်သည်။ ဤနေရာတွင် ထိုအမှားနှင့် callback ၏ limitReached အလံ ပေါင်းစပ်မှုကိုသာ မျှော်လင့်ထားသည်ဟု သတ်မှတ်သည်။

ကန့်သတ်ချက်ထက် တိုသော တုံ့ပြန်မှုသည် ပုံမှန်အတိုင်း ပြီးဆုံးသည်။ ကန့်သတ်ချက်တွင် သို့မဟုတ် ကျော်လွန်ပါက နောက်ဆုံး callback က ပိုကြီးသော အပိုင်းကို ရရှိသော်လည်း prefix သည် အများဆုံး 32 KiB သာ သိမ်းထားသည်။ အပိုင်း အရွယ်အစားများ ကွဲပြားသည်။ တောင်းဆိုထားသော buffer အရွယ်အစားသည် ပုံသေ အရှည် ခေါ်ဆိုမှုများအတွက် ကတိမဟုတ်ပါ။

ဤသည် သိမ်းထားသော ကိုယ်ထည်ကို ကန့်သတ်သည်၊ ချိတ်ဆက်မှုတွင် ရှိပြီးသား buffer လုပ်ထားသော သို့မဟုတ် လွှဲပြောင်းပြီးသော byte တိုင်းကို မဟုတ်ပါ။ ရှေ့ဆက်သည် ဘက်ပေါင်းစုံ byte စာလုံး၊ JSON တန်ဖိုး သို့မဟုတ် HTML အစိတ်အပိုင်း အတွင်း၌ ဆုံးနိုင်သည်၊ ထို့ကြောင့် ၎င်းသည် အပြည့်အစုံ ခွဲခြမ်းနိုင်သော စာရွက်စာတမ်းဟု မယူဆပါနှင့်။

ဆက်စပ်ဆောင်းပါးများ