Zacznij od wyniku cURL, gdy strona pobrana przez proxy wygląda na niekompletną. Krótka odpowiedź, nieudany transfer i pełna strona blokady wymagają różnych wyjaśnień.

Przy włączonym CURLOPT_RETURNTRANSFER na istniejącym skonfigurowanym 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);

Zbierz te wartości, zanim zwolnisz handle. Ścisłe porównanie odróżnia błąd transferu od udanej treści, takiej jak pusty ciąg lub “0”. Statusy błędów HTTP nie są automatycznie błędami curl_exec, więc interpretuj także status.

Licznik pobranych danych nie obejmuje nagłówków. Zadeklarowana wartość pochodzi z Content-Length i wynosi -1, gdy rozmiar jest nieznany. Odpowiedź może zgodnie z prawem pominąć Content-Length; nieznana wartość nie jest diagnozą obciętego pliku.

Automatyczne dekodowanie treści wprowadza kolejne rozróżnienie. Content-Length zwykle opisuje reprezentację skompresowaną, a ciąg PHP może zawierać bajty po dekompresji. Porównanie strlen($body) z tym nagłówkiem porównuje więc różne reprezentacje.

cURL może zgłosić CURLE_PARTIAL_FILE, gdy transfer narusza oczekiwany rozmiar. Zachowaj ten błąd, zamiast uznawać dowolne niepuste wyjście za sukces. Odwrotnie, udany transfer z małą odpowiedzią 200 może być całą stroną, którą źródło lub proxy postanowiły zwrócić.

Na koniec sprawdź wymaganą treść. HTML pobrany przez cURL nie uruchamia JavaScriptu, aby wypełnić stronę. Sekcje wyświetlane przez przeglądarkę mogą nie występować w pierwotnej odpowiedzi, nawet gdy dotarł każdy przesłany bajt.

Powiązane artykuły