ابدأ من نتيجة cURL عندما تبدو صفحة نُزّلت عبر وسيط غير مكتملة. الاستجابة القصيرة والنقل الفاشل وصفحة الحجب الكاملة تحتاج إلى تفسيرات مختلفة.

مع تفعيل 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);

اجمع هذه القيم قبل تحرير المقبض. المقارنة الصارمة تميّز فشل النقل عن الأجسام الناجحة مثل سلسلة فارغة أو “0”. حالات خطأ HTTP ليست فشلًا تلقائيًا في curl_exec، لذا فسّر الحالة أيضًا.

عدّاد التنزيل لا يشمل الترويسات. القيمة المعلنة تأتي من Content-Length وتكون -1 عندما يكون الحجم غير معروف. يجوز للاستجابة أن تحذف Content-Length؛ والقيمة المجهولة ليست تشخيصًا لملف مقطوع.

فك ترميز المحتوى التلقائي يضيف تمييزًا آخر. غالبًا يصف Content-Length التمثيل المضغوط، بينما قد تحتوي سلسلة PHP على بايتات مفكوكة. ومقارنة strlen($body) بذلك الترويسة تقارن تمثيلين مختلفين.

قد يبلّغ cURL عن CURLE_PARTIAL_FILE عندما يخالف النقل حجمًا متوقعًا. احتفظ بهذا الخطأ بدلًا من اعتبار أي خرج غير فارغ نجاحًا. في المقابل، قد يكون النقل الناجح باستجابة 200 صغيرة هو الصفحة كاملة التي اختار الأصل أو الوسيط إرجاعها.

وأخيرًا تحقّق من المحتوى المطلوب. HTML الذي يجلبه cURL لا ينفّذ JavaScript لملء الصفحة. الأقسام التي يعرضها المتصفح قد تكون غائبة عن الاستجابة الأصلية حتى مع وصول كل بايت مُرسل.

مقالات ذات صلة