Începeți cu rezultatul cURL când o pagină descărcată printr-un proxy pare incompletă. Un răspuns scurt, un transfer eșuat și o pagină de blocare completă necesită explicații diferite.

Cu CURLOPT_RETURNTRANSFER activat pe handle-ul deja configurat:

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

Colectați aceste valori înainte de a elibera handle-ul. Comparația strictă distinge o eroare de transport de un corp reușit, cum ar fi un șir gol sau “0”. Stările de eroare HTTP nu sunt automat eșecuri curl_exec, așa că interpretați și starea.

Contorul de descărcare nu include anteturile. Valoarea declarată provine din Content-Length și este -1 când dimensiunea este necunoscută. Un răspuns poate omite legitim Content-Length; o valoare necunoscută nu este un diagnostic de fișier trunchiat.

Decodarea automată a conținutului introduce o altă distincție. Content-Length descrie de obicei reprezentarea comprimată, în timp ce șirul PHP poate conține octeți decomprimați. Compararea strlen($body) cu acel antet compară atunci reprezentări diferite.

cURL poate raporta CURLE_PARTIAL_FILE când transferul încalcă o dimensiune așteptată. Păstrați acea eroare în loc să tratați orice ieșire nevidă ca succes. Invers, un transfer reușit cu un răspuns 200 mic poate fi întreaga pagină pe care originea sau proxy-ul au ales să o returneze.

În final verificați conținutul necesar. HTML-ul obținut de cURL nu execută JavaScript pentru a umple pagina. Secțiunile afișate de browser pot lipsi din răspunsul original chiar dacă a sosit fiecare octet transmis.

Articole similare