Դադարեցնել PHP cURL փոխանցումը մարմնի նախածանցից հետո
Պահեք սահմանափակ նախածանց գրելու callback-ում և ճանաչեք միայն այն գրելու սխալը, որն այդ callback-ը դիտավորյալ է առաջացրել։
cURL-ի գրելու callback-ը կարող է պահել մարմնի սահմանափակ նախածանց և դադարեցնել փոխանցումը, հենց այդ սահմանը լրանա։ Օգտագործեք ձեր սեփական դրոշակը՝ այդ դիտավորյալ դադարեցումը մեկ այլ գրելու ձախողումից տարբերելու համար։
Նոր 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);
}
Proxy URL-ի socks5h սխեման խնդրում է proxy-ին լուծել թիրախ հոսթի անունը։ Ցուցադրված նոր handle-ի վրա թույլատրելի հանրային թիրախով փորձարկման համար SOCKS5 proxy-ների ցանկից առանց հաշվի գրառումը կարող է տրամադրել այդ endpoint-ը։ TLS վկայագրի ստուգումը պահպանում է իր սովորական կարգավորումները։
Ոչ դատարկ բլոկի համար զրո վերադարձնելը libcurl-ին հաղորդում է, որ callback-ը չի ընդունել տրված տվյալները։ Այն ընդհատվում է CURLE_WRITE_ERROR-ով։ Այստեղ որպես սպասված դիտարկվում է միայն այդ սխալի և callback-ի limitReached դրոշակի համակցությունը։
Սահմանից կարճ պատասխանը ավարտվում է սովորական ձևով։ Սահմանին կամ դրանից բարձր prefix-ը պահում է առավելագույնը 32 KiB, նույնիսկ եթե վերջին callback-ը ստանում է ավելի մեծ բլոկ։ Բլոկների չափերը տարբերվում են. պահանջված բուֆերի չափը ֆիքսված երկարության կանչերի երաշխիք չէ։
Սա սահմանափակում է պահված մարմինը, ոչ թե կապի վրա արդեն բուֆերավորված կամ փոխանցված յուրաքանչյուր բայթը։ Նախածանցը կարող է ավարտվել բազմաբայթ նշանի, JSON արժեքի կամ HTML տարրի ներսում, ուստի մի ենթադրեք, որ այն ամբողջական վերլուծելի փաստաթուղթ է։