Je li PHP cURL odgovor odsječen?
Provjerite rezultat cURL prijenosa, status odgovora i prikaz tijela prije nego što uporedite preuzetu veličinu s Content-Length.
Počnite s rezultatom cURL-a kada stranica preuzeta preko proxyja izgleda nepotpuno. Kratak odgovor, neuspješan prijenos i potpuna stranica blokade traže različita objašnjenja.
Uz omogućen CURLOPT_RETURNTRANSFER na postojećem konfiguriranom handleu:
$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);
Prikupite te vrijednosti prije nego što oslobodite handle. Stroga usporedba razlikuje neuspjeh prijenosa od uspješnih tijela poput praznog niza ili “0”. HTTP statusi greške nisu automatski curl_exec neuspjesi, zato protumačite i status.
Brojač preuzimanja isključuje zaglavlja. Deklarirana vrijednost dolazi iz Content-Length i iznosi -1 kada je ta veličina nepoznata. Odgovor može legitimno izostaviti Content-Length; nepoznata vrijednost nije dijagnoza odsječene datoteke.
Automatsko dekodiranje sadržaja uvodi još jednu razliku. Content-Length obično opisuje komprimiranu reprezentaciju, dok PHP niz može sadržavati dekomprimirane bajtove. Usporedba strlen($body) s tim zaglavljem tada uspoređuje različite reprezentacije.
cURL može prijaviti CURLE_PARTIAL_FILE kada prijenos prekrši očekivanu veličinu. Sačuvajte tu grešku umjesto da svaki neprazan izlaz smatrate uspjehom. Suprotno tome, uspješan prijenos s malim odgovorom 200 može biti cijela stranica koju je izvor ili proxy odlučio vratiti.
Naposljetku provjerite potreban sadržaj. HTML koji cURL dohvati ne izvršava JavaScript da popuni stranicu. Dijelovi koje preglednik prikazuje mogu izostati iz izvornog odgovora čak i kada je svaki preneseni bajt stigao.