หยุดการถ่ายโอน PHP cURL หลังจากคำนำหน้าของเนื้อหา
เก็บคำนำหน้าของเนื้อหาแบบจำกัดใน write callback และรู้จักเฉพาะข้อผิดพลาดการเขียนที่ callback นั้นก่อขึ้นโดยเจตนา
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 ดังนั้นอย่าสันนิษฐานว่าเป็นเอกสารที่แยกวิเคราะห์ได้อย่างสมบูรณ์