Kusimamisha uhamishaji wa PHP cURL baada ya kiambishi cha mwili
Hifadhi kiambishi chenye ukomo katika write callback na utambue tu hitilafu ya uandishi inayosababishwa kwa makusudi na callback hiyo.
Write callback ya cURL inaweza kuhifadhi kiambishi cha mwili chenye ukomo na kusimamisha uhamishaji mara kikomo hicho kinapofikiwa. Tumia bendera yako mwenyewe kutofautisha kusimamisha huko kwa makusudi na hitilafu nyingine ya uandishi.
Kwa handle mpya ambayo URL lengwa yake imeundwa tayari:
$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);
}
Mpangilio wa socks5h wa URL ya proksi unaomba proksi itatue jina la mwenyeji lengwa. Kwa jaribio linaloruhusiwa la lengo la umma kwenye handle mpya iliyoonyeshwa, ingizo lisilo na akaunti kutoka orodha ya proksi za SOCKS5 linaweza kutoa endpoint hiyo. Uthibitishaji wa cheti cha TLS unabaki na mipangilio yake ya kawaida.
Kurudisha sifuri kwa kipande kisicho tupu kunaiambia libcurl kwamba callback haikukubali data iliyotolewa. Inasitisha kwa CURLE_WRITE_ERROR. Hapa mchanganyiko wa hitilafu hiyo na bendera ya limitReached ya callback pekee ndio huzingatiwa kama unaotarajiwa.
Jibu fupi kuliko kikomo huisha kwa kawaida. Kwenye au juu ya kikomo, prefix huhifadhi si zaidi ya 32 KiB hata kama callback ya mwisho inapokea kipande kikubwa. Ukubwa wa vipande hutofautiana; ukubwa wa buffer unaoombwa si ahadi ya miito yenye urefu usiobadilika.
Hii inaweka ukomo kwa mwili unaohifadhiwa, si kila baiti ambayo tayari imehifadhiwa kwenye buffer au imehamishwa kwenye muunganisho. Kiambishi kinaweza kuishia ndani ya herufi ya baiti nyingi, thamani ya JSON au kipengele cha HTML, kwa hivyo usidhani ni hati kamili inayoweza kuchanganuliwa.