Börja med cURL:s resultat när en sida som hämtats via en proxy verkar ofullständig. Ett kort svar, en misslyckad överföring och en fullständig blockeringssida kräver olika förklaringar.

Med CURLOPT_RETURNTRANSFER aktiverat på den befintliga konfigurerade handtagen:

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

Samla in dessa värden innan du släpper handtagen. Den strikta jämförelsen skiljer överföringsfel från lyckade kroppar som en tom sträng eller “0”. HTTP-felstatusar är inte automatiskt curl_exec-fel, så tolka även statusen.

Räknaren för nedladdade data utesluter rubriker. Det deklarerade värdet kommer från Content-Length och är -1 när storleken är okänd. Ett svar kan legitimit utelämna Content-Length; ett okänt värde är inte en diagnos på en avklippt fil.

Automatisk innehållsavkodning inför ännu en skillnad. Content-Length beskriver oftast den komprimerade representationen, medan PHP-strängen kan innehålla dekomprimerade byte. Att jämföra strlen($body) med den rubriken jämför då olika representationer.

cURL kan rapportera CURLE_PARTIAL_FILE när överföringen bryter mot en förväntad storlek. Behåll det felet i stället för att behandla alla icke-tomma utdata som framgång. Omvänt kan en lyckad överföring med ett litet 200-svar vara hela sidan som källan eller proxyn valde att returnera.

Till sist kontrollera det nödvändiga innehållet. HTML som hämtas av cURL kör inte JavaScript för att fylla sidan. Avsnitt som webbläsaren visar kan saknas i det ursprungliga svaret även när varje överförd byte har anlänt.

Relaterade artiklar