Adakah respons cURL PHP dipotong?
Semak hasil pemindahan cURL, status respons dan perwakilan badan sebelum membandingkan saiz muat turun dengan Content-Length.
Mulakan dengan hasil cURL apabila halaman yang dimuat turun melalui proksi kelihatan tidak lengkap. Respons pendek, pemindahan gagal dan halaman sekatan penuh memerlukan penjelasan yang berbeza.
Dengan CURLOPT_RETURNTRANSFER didayakan pada handle yang telah dikonfigurasikan:
$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 ini sebelum melepaskan handle. Perbandingan ketat membezakan kegagalan pemindahan daripada badan berjaya seperti rentetan kosong atau “0”. Status ralat HTTP bukan kegagalan curl_exec secara automatik, jadi tafsirkan juga statusnya.
Kaunter muat turun tidak termasuk pengepala. Nilai yang diisytiharkan datang daripada Content-Length dan bernilai -1 apabila saiz itu tidak diketahui. Respons boleh meninggalkan Content-Length secara sah; nilai tidak diketahui bukan diagnosis fail yang dipotong.
Penyahkodan kandungan automatik menambah satu lagi perbezaan. Content-Length biasanya menerangkan perwakilan termampat, manakala rentetan PHP boleh mengandungi bait yang telah dinyahmampat. Membandingkan strlen($body) dengan pengepala itu bermakna membandingkan perwakilan yang berbeza.
cURL boleh melaporkan CURLE_PARTIAL_FILE apabila pemindahan melanggar saiz yang dijangka. Simpan ralat itu daripada menganggap sebarang output tidak kosong sebagai kejayaan. Sebaliknya, pemindahan berjaya dengan respons 200 kecil mungkin merupakan keseluruhan halaman yang dipilih oleh asalan atau proksi untuk dikembalikan.
Akhir sekali semak kandungan yang diperlukan. HTML yang diambil oleh cURL tidak menjalankan JavaScript untuk mengisi halaman. Bahagian yang dipaparkan pelayar mungkin tiada dalam respons asal walaupun setiap bait yang dihantar telah tiba.