Comenceu pel resultat de cURL quan una pàgina descarregada a través d’un proxy sembla incompleta. Una resposta curta, una transferència fallida i una pàgina de bloqueig completa necessiten explicacions diferents.

Amb CURLOPT_RETURNTRANSFER activat al handle configurat existent:

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

Recolliu aquests valors abans d’alliberar el handle. La comparació estricta distingeix un fallo de transport d’un cos correcte com una cadena buida o “0”. Els estats d’error HTTP no són automàticament fallades de curl_exec, així que interpreteu també l’estat.

El comptador de descàrrega exclou les capçaleres. El valor declarat prové de Content-Length i és -1 quan aquesta mida és desconeguda. Una resposta pot ometre legítimament Content-Length; un valor desconegut no és un diagnòstic de fitxer truncat.

La descodificació automàtica del contingut introdueix una altra distinció. Content-Length sol descriure la representació comprimida, mentre que la cadena PHP pot contenir bytes descomprimits. Comparar strlen($body) amb aquesta capçalera compara, doncs, representacions diferents.

cURL pot informar de CURLE_PARTIAL_FILE quan la transferència vulnera una mida esperada. Conserveu aquest error en lloc de tractar qualsevol sortida no buida com un èxit. Al contrari, una transferència correcta amb una resposta 200 petita pot ser tota la pàgina que l’origen o el proxy van decidir retornar.

Finalment comproveu el contingut necessari. L’HTML obtingut per cURL no executa JavaScript per omplir la pàgina. Les seccions que el navegador mostra poden faltar a la resposta original encara que hagi arribat cada byte transmès.

Articles relacionats