Bola odpoveď PHP cURL skrátená?
Skontrolujte výsledok prenosu cURL, stav odpovede a reprezentáciu tela predtým, než porovnáte stiahnutú veľkosť s Content-Length.
Začnite výsledkom cURL, keď stránka stiahnutá cez proxy vyzerá neúplne. Krátka odpoveď, neúspešný prenos a úplná blokovacia stránka si vyžadujú rôzne vysvetlenia.
S povoleným CURLOPT_RETURNTRANSFER na existujúcom nakonfigurovanom 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);
Zhromaždite tieto hodnoty pred uvoľnením handle. Striktné porovnanie odlišuje zlyhanie prenosu od úspešného tela, ako je prázdny reťazec alebo “0”. Stavové kódy chýb HTTP nie sú automaticky zlyhaniami curl_exec, preto interpretujte aj stav.
Počítadlo stiahnutých údajov nezahŕňa hlavičky. Deklarovaná hodnota pochádza z Content-Length a je -1, keď je veľkosť neznáma. Odpoveď môže legitímne vynechať Content-Length; neznáma hodnota nie je diagnózou skráteného súboru.
Automatické dekódovanie obsahu prináša ďalší rozdiel. Content-Length zvyčajne opisuje komprimovanú reprezentáciu, zatiaľ čo reťazec PHP môže obsahovať dekomprimované bajty. Porovnanie strlen($body) s touto hlavičkou potom porovnáva rôzne reprezentácie.
cURL môže ohlásiť CURLE_PARTIAL_FILE, keď prenos poruší očakávanú veľkosť. Zachovajte túto chybu, namiesto toho, aby ste akýkoľvek neprázdny výstup považovali za úspech. Naopak, úspešný prenos s malou odpoveďou 200 môže byť celá stránka, ktorú sa zdroj alebo proxy rozhodli vrátiť.
Nakoniec skontrolujte požadovaný obsah. HTML získané cURL nespúšťa JavaScript na vyplnenie stránky. Časti, ktoré zobrazuje prehliadač, môžu v pôvodnej odpovedi chýbať, aj keď dorazil každý prenesený bajt.