Чи було обрізано відповідь PHP cURL?
Перевірте результат передавання cURL, стан відповіді та подання тіла, перш ніж порівнювати завантажений розмір із Content-Length.
Почніть із результату cURL, коли сторінка, завантажена через проксі, виглядає неповною. Коротка відповідь, невдале передавання й повна сторінка блокування потребують різних пояснень.
Коли на наявному налаштованому handle увімкнено CURLOPT_RETURNTRANSFER:
$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 для заповнення сторінки. Розділи, які показує браузер, можуть бути відсутні у початковій відповіді, навіть якщо кожен переданий байт надійшов.