Truncouse a resposta cURL de PHP?
Comprobe o resultado da transferencia de cURL, o estado da resposta e a representación do corpo antes de comparar o tamaño descargado con Content-Length.
Comece polo resultado de cURL cando unha páxina descargada a través dun proxy parece incompleta. Unha resposta curta, unha transferencia fallida e unha páxina de bloqueo completa precisan explicacións diferentes.
Con CURLOPT_RETURNTRANSFER activado no handle xa configurado:
$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);
Reúna estes valores antes de liberar o handle. A comparación estrita distingue un fallo de transporte dun corpo correcto como unha cadea baleira ou “0”. Os estados de erro HTTP non son fallos automáticos de curl_exec, así que interprete tamén o estado.
O contador de descarga exclúe as cabeceiras. O valor declarado procede de Content-Length e é -1 cando ese tamaño é descoñecido. Unha resposta pode omitir Content-Length lexitimamente; un valor descoñecido non é un diagnóstico de ficheiro truncado.
A decodificación automática do contido introduce outra distinción. Content-Length adoita describir a representación comprimida, mentres que a cadea PHP pode conter bytes descomprimidos. Comparar strlen($body) con esa cabeceira compara entón representacións diferentes.
cURL pode informar de CURLE_PARTIAL_FILE cando a transferencia infrinxe un tamaño esperado. Conserve ese erro no canto de tratar calquera saída non baleira como un éxito. Ao revés, unha transferencia correcta cunha resposta 200 pequena pode ser toda a páxina que a orixe ou o proxy decidiron devolver.
Por último comprobe o contido necesario. O HTML que obtén cURL non executa JavaScript para encher a páxina. As seccións que mostra o navegador poden faltar na resposta orixinal aínda que chegase cada byte transmitido.