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 لانغان ياكى يۆتكەلگەن ھەر بىر بايتنى ئەمەس. ئالدى قىسىم كۆپ بايتلىق ھەرپ، JSON قىممىتى ياكى HTML ئېلېمېنتى ئىچىدە ئاخىرلىشىشى مۇمكىن، شۇڭا ئۇنى تولۇق تەھلىل قىلغىلى بولىدىغان ھۆججەت دەپ ئويلىماڭ.

مۇناسىۋەتلىك ماقالىلەر