ຢຸດການໂອນ 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 proxy ຂໍໃຫ້ proxy ແກ້ໄຂຊື່ໂຮສເປົ້າໝາຍ. ສຳລັບການທົດສອບເປົ້າໝາຍສາທາລະນະທີ່ອະນຸຍາດໃນ handle ໃໝ່ທີ່ສະແດງ, ລາຍການທີ່ບໍ່ມີບັນຊີຈາກລາຍຊື່ proxy SOCKS5ສາມາດໃຫ້ endpoint ນັ້ນ. ການກວດສອບໃບຢັ້ງຢືນ TLS ຍັງຄົງການຕັ້ງຄ່າປົກກະຕິ.
ການສົ່ງຄືນສູນສຳລັບ chunk ທີ່ບໍ່ຫວ່າງເປົ່າ ບອກ libcurl ວ່າcallback ບໍ່ໄດ້ຮັບຂໍ້ມູນທີ່ໃຫ້. ມັນຢຸດດ້ວຍ CURLE_WRITE_ERROR. ທີ່ນີ້ ພຽງແຕ່ການລວມກັນຂອງຄວາມຜິດພາດນັ້ນ ແລະ ທຸງ limitReached ຂອງ callback ເທົ່ານັ້ນທີ່ຖືວ່າເປັນການຄາດຫວັງ.
ການຕອບກັບທີ່ສັ້ນກວ່າຂອບເຂດຈະສິ້ນສຸດຕາມປົກກະຕິ. ຢູ່ຂອບເຂດ ຫຼື ເກີນກວ່າ, prefix ເກັບໄດ້ສູງສຸດ 32 KiB ເຖິງແມ່ນ callback ສຸດທ້າຍໄດ້ຮັບ chunk ໃຫຍ່ກວ່າ. ຂະໜາດ chunk ປ່ຽນແປງ; ຂະໜາດ buffer ທີ່ຮ້ອງຂໍບໍ່ແມ່ນການຮັບປະກັນການເອີ້ນຄວາມຍາວຄົງທີ່.
ນີ້ຈຳກັດເນື້ອຄວາມທີ່ເກັບໄວ້ ບໍ່ແມ່ນທຸກ byte ທີ່ buffer ໄວ້ ຫຼື ໂອນໄປແລ້ວເທິງການເຊື່ອມຕໍ່. ເຄື່ອງໝາຍນຳໜ້າອາດສິ້ນສຸດຢູ່ໃນຕົວອັກສອນຫຼາຍ byte, ຄ່າ JSON ຫຼື ອົງປະກອບ HTML, ດັ່ງນັ້ນຢ່າສົມມຸດວ່າມັນເປັນເອກະສານທີ່ແຍກຄວາມໄດ້ຢ່າງສົມບູນ.