Pradėkite nuo cURL rezultato, kai per tarpinį serverį atsisiųstas puslapis atrodo nepilnas. Trumpas atsakymas, nepavykęs perdavimas ir visa blokavimo puslapis reikalauja skirtingų paaiškinimų.

Kai esamame sukonfigūruotame handle įjungtas CURLOPT_RETURNTRANSFER:

$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);

Surinkite šias reikšmes prieš atlaisvindami handle. Griežtas palyginimas atskiria perdavimo gedimą nuo sėkmingo turinio, pavyzdžiui, tuščios eilutės ar “0”. HTTP klaidų būsenos nėra automatiškai curl_exec gedimai, todėl interpretuokite ir būseną.

Atsisiųstų baitų skaitiklis neapima antraščių. Deklaruota reikšmė gaunama iš Content-Length ir yra -1, kai dydis nežinomas. Atsakymas gali teisėtai praleisti Content-Length; nežinoma reikšmė nėra sutrumpinto failo diagnozė.

Automatinis turinio dekodavimas įneša dar vieną skirtumą. Content-Length paprastai aprašo suspaustą pateikimą, o PHP eilutėje gali būti išspaustų baitų. Palyginus strlen($body) su ta antrašte, lyginami skirtingi pateikimai.

cURL gali pranešti CURLE_PARTIAL_FILE, kai perdavimas pažeidžia numatomą dydį. Išsaugokite šią klaidą, o ne laikykite bet kokios netuščios išvesties sėkme. Atvirkščiai, sėkmingas perdavimas su mažu 200 atsakymu gali būti visas puslapis, kurį šaltinis ar tarpinis serveris nusprendė grąžinti.

Galiausiai patikrinkite reikiamą turinį. cURL gautas HTML nevykdo JavaScript, kad užpildytų puslapį. Naršyklės rodomos dalys gali būti ne pradiniame atsakyme, net kai atvyko kiekvienas perduotas baitas.

Susiję straipsniai