Byla odpověď PHP cURL zkrácena?
Zkontrolujte výsledek přenosu cURL, stav odpovědi a reprezentaci těla dříve, než porovnáte staženou velikost s Content-Length.
Začněte výsledkem cURL, když stránka stažená přes proxy vypadá neúplně. Krátká odpověď, neúspěšný přenos a úplná blokovací stránka vyžadují různá vysvětlení.
S povoleným CURLOPT_RETURNTRANSFER na stávajícím nakonfigurovaném handle:
$body = curl_exec($ch);
if ($body === false) {
throw new RuntimeException(curl_error($ch), curl_errno($ch));
}
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$downloaded = curl_getinfo($ch, CURLINFO_SIZE_DOWNLOAD_T);
$declared = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD_T);
Tyto hodnoty sesbírejte ještě před uvolněním handle. Striktní porovnání odlišuje selhání přenosu od úspěšného těla, jako je prázdný řetězec nebo “0”. Stavové kódy chyb HTTP nejsou automaticky selháním curl_exec, proto interpretujte i stav.
Počítadlo stažených dat nezahrnuje hlavičky. Deklarovaná hodnota pochází z Content-Length a je -1, když je velikost neznámá. Odpověď může Content-Length legitimně vynechat; neznámá hodnota není diagnózou zkráceného souboru.
Automatické dekódování obsahu přináší další rozdíl. Content-Length obvykle popisuje komprimovanou reprezentaci, zatímco řetězec PHP může obsahovat dekomprimované bajty. Porovnání strlen($body) s touto hlavičkou pak porovnává různé reprezentace.
cURL může ohlásit CURLE_PARTIAL_FILE, když přenos poruší očekávanou velikost. Zachovejte tuto chybu, místo abyste jakýkoli neprázdný výstup považovali za úspěch. Naopak úspěšný přenos s malou odpovědí 200 může být celá stránka, kterou se zdroj nebo proxy rozhodly vrátit.
Nakonec zkontrolujte požadovaný obsah. HTML načtené cURL nespouští JavaScript, aby stránku naplnilo. Chybějící části, které zobrazuje prohlížeč, mohou v původní odpovědi scházet, i když dorazil každý přenesený bajt.