বডি প্রিফিক্সের পরে PHP cURL ট্রান্সফার থামান
রাইট কলব্যাকে একটি সীমিত প্রিফিক্স রাখুন এবং শুধুমাত্র সেই কলব্যাকের ইচ্ছাকৃত রাইট ত্রুটিকেই চিনুন।
একটি cURL রাইট কলব্যাক সীমিত বডি প্রিফিক্স ধরে রাখতে পারে এবং সেই সীমায় পৌঁছালে ট্রান্সফার থামাতে পারে। সেই ইচ্ছাকৃত থামা অন্য রাইট ব্যর্থতা থেকে আলাদা করতে নিজের ফ্ল্যাগ ব্যবহার করুন।
এমন একটি নতুন হ্যান্ডেলের জন্য যার লক্ষ্য URL ইতিমধ্যে কনফিগার করা:
$limit = 32768;
$prefix = '';
$limitReached = false;
curl_setopt_array($ch, [
CURLOPT_PROXY => 'socks5h://proxy.example.net:1080',
CURLOPT_HEADER => false,
CURLOPT_WRITEFUNCTION => function ($handle, $chunk)
use (&$prefix, &$limitReached, $limit) {
$remaining = $limit - strlen($prefix);
$prefix .= substr($chunk, 0, $remaining);
if (strlen($prefix) >= $limit) {
$limitReached = true;
return 0;
}
return strlen($chunk);
},
]);
$result = curl_exec($ch);
$error = curl_errno($ch);
$expectedStop = $limitReached && $error === CURLE_WRITE_ERROR;
if ($result === false && !$expectedStop) {
throw new RuntimeException(curl_error($ch), $error);
}
প্রক্সি URL-এর socks5h স্কিম প্রক্সিকে লক্ষ্য হোস্টনেম রিজলভ করতে বলে। দেখানো নতুন হ্যান্ডেলে অনুমোদিত পাবলিক-লক্ষ্য পরীক্ষার জন্য SOCKS5 প্রক্সি তালিকার একটি অ্যাকাউন্টহীন এন্ট্রি সেই এন্ডপয়েন্ট দিতে পারে। TLS সার্টিফিকেট যাচাই তার স্বাভাবিক সেটিংস রাখে।
খালি নয় এমন চাঙ্কের জন্য শূন্য ফেরানো libcurl-কে জানায় যে কলব্যাক প্রদত্ত ডেটা গ্রহণ করেনি। এটি CURLE_WRITE_ERROR দিয়ে বন্ধ হয়। এখানে শুধু সেই ত্রুটি ও কলব্যাকের limitReached ফ্ল্যাগের সমন্বয়কেই প্রত্যাশিত ধরা হয়।
সীমার চেয়ে ছোট প্রতিক্রিয়া স্বাভাবিকভাবে শেষ হয়। সীমায় বা তার বেশি হলে prefix সর্বোচ্চ 32 KiB রাখে, শেষ কলব্যাক বড় চাঙ্ক পেলেও। কলব্যাকের চাঙ্কের আকার বদলায়; অনুরোধ করা বাফার আকার স্থির দৈর্ঘ্যের কলে প্রতিশ্রুতি নয়।
এটি ধরে রাখা বডি সীমিত করে, সংযোগে ইতিমধ্যে বাফার করা বা স্থানান্তরিত প্রতিটি বাইট নয়। প্রিফিক্সটি একটি মাল্টিবাইট অক্ষর, JSON মান বা HTML এলিমেন্টের ভেতরে শেষ হতে পারে, তাই এটি সম্পূর্ণ পার্সযোগ্য নথি ভেবো না।