آیا پاسخ cURL در PHP بریده شده است؟
نتیجه انتقال cURL، وضعیت پاسخ و نمایش بدنه را پیش از مقایسه حجم دانلودشده با Content-Length بررسی کنید.
وقتی صفحهای که از طریق پروکسی دانلود شده ناقص به نظر میرسد، از نتیجه 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 اجرا نمیکند. بخشهایی که مرورگر نشان میدهد ممکن است حتی با رسیدن هر بایت منتقلشده در پاسخ اصلی نباشند.