write 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 ยังคงการตั้งค่าปกติ

การคืนค่าศูนย์สำหรับชิ้นข้อมูลที่ไม่ว่างจะบอก libcurl ว่าcallback ไม่ยอมรับข้อมูลที่ให้มา จึงหยุดด้วย CURLE_WRITE_ERROR ที่นี่จะถือว่าเป็นสิ่งที่คาดไว้เฉพาะการรวมกันของข้อผิดพลาดนั้นกับแฟล็ก limitReached ของ callback เท่านั้น

การตอบกลับที่สั้นกว่าขีดจำกัดจะจบตามปกติ ที่ขีดจำกัดหรือเกินกว่า prefix จะเก็บไว้ไม่เกิน 32 KiB แม้ callback สุดท้ายจะได้รับชิ้นข้อมูลที่ใหญ่กว่า ขนาดชิ้นข้อมูลแตกต่างกัน ขนาดบัฟเฟอร์ที่ร้องขอไม่ใช่คำมั่นว่าการเรียกจะมีความยาวคงที่

สิ่งนี้จำกัดเนื้อหาที่เก็บไว้ ไม่ใช่ทุกไบต์ที่บัฟเฟอร์ไว้หรือถ่ายโอนบนการเชื่อมต่อแล้ว คำนำหน้าอาจสิ้นสุดกลางอักขระหลายไบต์ ค่า JSON หรือองค์ประกอบ HTML ดังนั้นอย่าสันนิษฐานว่าเป็นเอกสารที่แยกวิเคราะห์ได้อย่างสมบูรณ์

บทความที่เกี่ยวข้อง