Ble PHP cURL-svaret avkortet?
Kontroller cURLs overføringsresultat, svarbestatus og kroppsrepresentasjon før du sammenligner nedlastet størrelse med Content-Length.
Begynn med cURLs resultat når en side lastet ned via en proxy ser ufullstendig ut. Et kort svar, en mislykket overføring og en komplett blokkeringsside krever forskjellige forklaringer.
Med CURLOPT_RETURNTRANSFER aktivert på det eksisterende konfigurerte 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);
Samle disse verdiene før du frigjør handle. Den strenge sammenligningen skiller overføringsfeil fra vellykkede kropper som en tom streng eller “0”. HTTP-feilstatusser er ikke automatisk curl_exec-feil, så tolk også statusen.
Telleren for nedlastet data utelater headere. Den deklarerte verdien kommer fra Content-Length og er -1 når størrelsen er ukjent. Et svar kan med rette utelate Content-Length; en ukjent verdi er ikke en diagnose på en avkortet fil.
Automatisk innholdskoding innfører nok en forskjell. Content-Length beskriver vanligvis den komprimerte representasjonen, mens PHP-strengen kan inneholde dekomprimerte bytes. Å sammenligne strlen($body) med den headeren sammenligner da forskjellige representasjoner.
cURL kan rapportere CURLE_PARTIAL_FILE når overføringen bryter en forventet størrelse. Behold den feilen i stedet for å behandle enhver ikke-tom utdata som suksess. Omvendt kan en vellykket overføring med et lite 200-svar være hele siden kilden eller proxyen valgte å returnere.
Til slutt kontroller det nødvendige innholdet. HTML hentet av cURL kjører ikke JavaScript for å fylle siden. Avsnitt som nettleseren viser, kan mangle i det opprinnelige svaret selv når hver overført byte har ankommet.