Phản hồi cURL của PHP có bị cắt ngắn không?
Kiểm tra kết quả truyền của cURL, trạng thái phản hồi và cách biểu diễn phần thân trước khi so sánh kích thước đã tải với Content-Length.
Hãy bắt đầu từ kết quả của cURL khi một trang tải qua proxy có vẻ không đầy đủ. Phản hồi ngắn, truyền thất bại và trang chặn hoàn chỉnh cần những lời giải thích khác nhau.
Khi CURLOPT_RETURNTRANSFER được bật trên handle đã cấu hình sẵn:
$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);
Thu thập các giá trị này trước khi giải phóng handle. So sánh nghiêm ngặt phân biệt lỗi truyền với phần thân thành công như chuỗi rỗng hoặc “0”. Trạng thái lỗi HTTP không tự động là lỗi curl_exec, vì vậy hãy diễn giải cả trạng thái.
Bộ đếm đã tải không bao gồm các tiêu đề. Giá trị được khai báo đến từ Content-Length và là -1 khi không biết kích thước. Phản hồi có thể bỏ qua Content-Length một cách hợp lệ; giá trị không xác định không phải là chẩn đoán tệp bị cắt.
Việc giải mã nội dung tự động tạo thêm một khác biệt. Content-Length thường mô tả biểu diễn đã nén, trong khi chuỗi PHP có thể chứa các byte đã giải nén. So sánh strlen($body) với tiêu đề đó là so sánh các biểu diễn khác nhau.
cURL có thể báo CURLE_PARTIAL_FILE khi quá trình truyền vi phạm kích thước mong đợi. Hãy giữ lại lỗi đó thay vì coi mọi đầu ra không rỗng là thành công. Ngược lại, một lần truyền thành công với phản hồi 200 nhỏ có thể là toàn bộ trang mà nguồn hoặc proxy đã chọn trả về.
Cuối cùng kiểm tra nội dung cần thiết. HTML do cURL lấy về không chạy JavaScript để lấp đầy trang. Các phần mà trình duyệt hiển thị có thể không có trong phản hồi gốc ngay cả khi mọi byte được truyền đã đến.