Je bil odgovor PHP cURL odrezan?
Preverite rezultat prenosa cURL, stanje odgovora in predstavitev telesa, preden primerjate preneseno velikost s Content-Length.
Začnite z rezultatom cURL, ko je stran, prenesena prek proxyja, videti nepopolna. Kratek odgovor, neuspešen prenos in popolna stran blokade zahtevajo različne razlage.
Z omogočenim CURLOPT_RETURNTRANSFER na obstoječem konfiguriranem 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);
Zberite te vrednosti, preden sprostite handle. Stroga primerjava loči napako prenosa od uspešnega telesa, kot je prazen niz ali “0”. Statusi napak HTTP niso samodejno neuspehi curl_exec, zato razložite tudi status.
Števec prenesenih podatkov ne vključuje glave. Deklarirana vrednost izhaja iz Content-Length in je -1, ko je velikost neznana. Odgovor lahko zakonito izpusti Content-Length; neznana vrednost ni diagnoza odrezane datoteke.
Samodejno dekodiranje vsebine prinaša še eno razliko. Content-Length običajno opisuje stisnjeno predstavitev, medtem ko lahko niz PHP vsebuje razširjene bajte. Primerjava strlen($body) s to glavo primerja različne predstavitve.
cURL lahko sporoči CURLE_PARTIAL_FILE, ko prenos krši pričakovano velikost. Ohranite to napako, namesto da bi vsak neprazen izhod obravnavali kot uspeh. Nasprotno pa je uspešen prenos z majhnim odgovorom 200 lahko cela stran, ki se je izvor ali proxy odločil vrniti.
Na koncu preverite zahtevano vsebino. HTML, ki ga pridobi cURL, ne izvaja JavaScripta za polnjenje strani. Razdelki, ki jih prikaže brskalnik, lahko v izvirnem odgovoru manjkajo, tudi ko je prispel vsak preneseni bajt.