Начните с результата cURL, когда страница, загруженная через прокси, выглядит неполной. Короткий ответ, неудачная передача и полная страница блокировки требуют разных объяснений.

При включённом CURLOPT_RETURNTRANSFER на уже настроенном 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);

Соберите эти значения до освобождения handle. Строгое сравнение отличает сбой передачи от успешного тела, например пустой строки или “0”. Статусы ошибок HTTP не являются автоматически сбоями curl_exec, поэтому интерпретируйте и статус.

Счётчик загруженных данных не включает заголовки. Объявленное значение берётся из Content-Length и равно -1, когда размер неизвестен. Ответ может законно опускать Content-Length; неизвестное значение не является диагнозом обрезанного файла.

Автоматическое декодирование содержимого добавляет ещё одно различие. Content-Length обычно описывает сжатое представление, тогда как строка PHP может содержать распакованные байты. Сравнение strlen($body) с этим заголовком сравнивает разные представления.

cURL может сообщить CURLE_PARTIAL_FILE, когда передача нарушает ожидаемый размер. Сохраняйте эту ошибку, а не считайте любой непустой вывод успехом. Наоборот, успешная передача с небольшим ответом 200 может быть всей страницей, которую источник или прокси решили вернуть.

Наконец, проверьте нужное содержимое. HTML, полученный cURL, не выполняет JavaScript для заполнения страницы. Разделы, которые показывает браузер, могут отсутствовать в исходном ответе, даже если каждый переданный байт дошёл.

Похожие статьи