PHP cURL өткөрүүсүн дене префиксинен кийин токтотуу
Жазуу callbackинде чектелген префихти сактап, ошол callback атайын жараткан жазуу катасын гана тааныңыз.
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 схемасы проксиден максаттуу хост атын чечүүнү суранат. Көрсөтүлгөн жаңы handleде уруксат берилген коомдук максатты сыноо үчүн SOCKS5 прокси тизмесинен аккаунтсуз жазуу ошол endpointти бере алат. TLS сертификатын текшерүү кадимки жөндөөлөрүн сактайт.
Бош эмес бөлүк үчүн нөл кайтаруу libcurlге callback берилген маалыматтарды кабыл албаганын билдирет. Ал CURLE_WRITE_ERROR менен токтойт. Бул жерде күтүлгөн нерсе катары ошол ката менен callbackдин limitReached желегинин айкалышы гана каралат.
Чектен кыска жооп кадимкидей бүтөт. Чекте же андан жогору prefix эң көп 32 KiB сактайт, акыркы callback чоңураак бөлүк алса да. Бөлүктүн өлчөмдөрү ар башка; суралган буфер өлчөмү туруктуу узундуктагы чакырууларга кепилдик эмес.
Бул сакталган денени чектейт, байланышта мурунтан буферленген же өткөрүлгөн ар бир байтты эмес. Префикс көп байттуу белгинин, JSON маанисинин же HTML элементинин ичинде бүтүшү мүмкүн, ошондуктан аны толук талдоого боло турган документ деп эсептебеңиз.