PHP cURL এর প্রতিক্রিয়া কি কাটা পড়েছিল?
ডাউনলোড করা আকার Content-Length এর সাথে তুলনা করার আগে cURL এর ট্রান্সফার ফলাফল, প্রতিক্রিয়ার অবস্থা এবং body এর উপস্থাপনা যাচাই করুন।
প্রক্সির মাধ্যমে ডাউনলোড করা পৃষ্ঠা অসম্পূর্ণ মনে হলে cURL এর ফলাফল দিয়ে শুরু করুন। সংক্ষিপ্ত প্রতিক্রিয়া, ব্যর্থ ট্রান্সফার এবং সম্পূর্ণ ব্লক পৃষ্ঠার জন্য ভিন্ন ব্যাখ্যা দরকার।
বর্তমান কনফিগার করা handle এ 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);
handle ছাড়ার আগে এই মানগুলি সংগ্রহ করুন। কঠোর তুলনা ট্রান্সফার ব্যর্থতাকে সফল body যেমন খালি string বা “0” থেকে আলাদা করে। HTTP ত্রুটি অবস্থা স্বয়ংক্রিয়ভাবে curl_exec ব্যর্থতা নয়, তাই অবস্থাও ব্যাখ্যা করুন।
ডাউনলোড করা কাউন্টারে header থাকে না। ঘোষিত মান Content-Length থেকে আসে এবং আকার অজানা হলে -1 হয়। প্রতিক্রিয়া বৈধভাবে Content-Length বাদ দিতে পারে; অজানা মান কাটা ফাইলের রোগনির্ণয় নয়।
স্বয়ংক্রিয় content decoding আরেকটি পার্থক্য আনে। Content-Length সাধারণত সংকুচিত উপস্থাপনা বর্ণনা করে, অথচ PHP string এ ডিকম্প্রেস করা byte থাকতে পারে। তখন strlen($body) কে ওই header এর সাথে তুলনা করলে ভিন্ন উপস্থাপনা তুলনা করা হয়।
ট্রান্সফার প্রত্যাশিত আকার লঙ্ঘন করলে cURL CURLE_PARTIAL_FILE রিপোর্ট করতে পারে। যেকোনো অখালি আউটপুটকে সফলতা ধরে নেওয়ার বদলে সেই ত্রুটি সংরক্ষণ করুন। বিপরীতে, ছোট 200 প্রতিক্রিয়াসহ সফল ট্রান্সফার মূল সাইট বা প্রক্সি যে সম্পূর্ণ পৃষ্ঠা ফেরাতে বেছে নিয়েছে সেটিই হতে পারে।
শেষে প্রয়োজনীয় বিষয়বস্তু যাচাই করুন। cURL যে HTML আনে তা পৃষ্ঠা ভরাতে JavaScript চালায় না। ব্রাউজারে দেখা অনুপস্থিত অংশগুলি পাঠানো প্রতিটি byte পৌঁছালেও মূল প্রতিক্রিয়ায় না থাকতে পারে।