Mulailah dari hasil cURL ketika halaman yang diunduh melalui proxy tampak tidak lengkap. Respons pendek, transfer gagal, dan halaman blokir penuh memerlukan penjelasan yang berbeda.

Dengan CURLOPT_RETURNTRANSFER aktif pada handle yang sudah dikonfigurasi:

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

Kumpulkan nilai-nilai ini sebelum melepaskan handle. Perbandingan ketat membedakan kegagalan transfer dari body yang berhasil seperti string kosong atau “0”. Status kesalahan HTTP bukan otomatis kegagalan curl_exec, jadi tafsirkan juga statusnya.

Penghitung unduhan tidak termasuk header. Nilai yang dideklarasikan berasal dari Content-Length dan bernilai -1 ketika ukuran tidak diketahui. Respons boleh secara sah menghilangkan Content-Length; nilai tidak diketahui bukan diagnosis file terpotong.

Dekode konten otomatis menambahkan perbedaan lain. Content-Length biasanya menggambarkan representasi terkompresi, sedangkan string PHP dapat berisi byte yang sudah didekompresi. Membandingkan strlen($body) dengan header itu berarti membandingkan representasi yang berbeda.

cURL dapat melaporkan CURLE_PARTIAL_FILE ketika transfer melanggar ukuran yang diharapkan. Simpan kesalahan itu alih-alih menganggap keluaran tidak kosong sebagai keberhasilan. Sebaliknya, transfer berhasil dengan respons 200 kecil mungkin adalah seluruh halaman yang dipilih sumber atau proxy untuk dikembalikan.

Akhirnya periksa konten yang diperlukan. HTML yang diambil cURL tidak menjalankan JavaScript untuk mengisi halaman. Bagian yang ditampilkan browser bisa tidak ada dalam respons asli meskipun setiap byte yang dikirim telah tiba.

Artikel terkait